Dart StreamクラスのhandleError()メソッドについてメモ書き。
handleError()はStreamイベントのエラーをインターセプトするラッパーStreamを生成するメソッド。
引数としてonError関数を指定し、インターセプト時のコールバック処理を記述する。onError関数の戻り値はvoid型で、引数に「エラーオブジェクト」か、もしくは「エラーオブジェクト、スタックトレース」を受け取る。
handleError()は名前付きオプション引数(省略可)test:でインターセプトするエラー条件を記述できる。戻り値はbool型。test:を記述しない場合は全てのエラーがインターセプトの対象となる。
handleError()自体の戻り値はStream<T>型。元のStreamがブロードキャストであれば、ブロードキャストで返す。
コーディングで動作確認。
動作確認のため「i==3」の時に例外を発生させる。
void main() async {
final stream = () async* {
for (int i = 0; i < 5; i++) {
if (i == 3) {
throw "Error Test";
}
yield i;
}
}();
// handleErrorでエラーをインターセプト
stream.handleError(
// 以下onError関数では第1引数にエラーオブジェクト、第2引数でスタックトレースを受け取っている
(err, st) {
print("handleErrorメッセージ:$err");
print("handleErrorスタックトレース:$st");
},
test: (error) => error == "Error Test",
// listenにエラー発生時の処理(onError:)を追加
).listen(print, onError: (e) {
print("onError:$e");
});
}
実行結果。
名前付きオプション引数test:で、エラーが「Error Test」の時にインターセプトするように条件を付与している。また、エラーオブジェクトとスタックトレース両方を出力している。
0
1
2
handleErrorメッセージ:Error Test
handleErrorスタックトレース:#0 main.<anonymous closure> (file:///Users/**************/app/dart/dev2/bin/dev2.dart:5:9)
<asynchronous suspension>
次はtest:の条件を変更し、条件にマッチしない場合を確認。
void main() async {
final stream = () async* {
for (int i = 0; i < 5; i++) {
if (i == 3) {
throw "Error Test";
}
yield i;
}
}();
// handleErrorでエラーをインターセプト
stream.handleError(
// 以下onError関数では第1引数にエラーオブジェクト、第2引数でスタックトレースを受け取っている
(err, st) {
print("handleErrorメッセージ:$err");
print("handleErrorスタックトレース:$st");
},
test: (error) => error == "Test",
// listenにエラー発生時の処理(onError:)を追加
).listen(print, onError: (e) {
print("onError:$e");
});
}
実行結果。
handleError()ではインターセプトせず、listen()のonError:が実行される。
0
1
2
onError:Error Test
最後はtest:を省略する。
void main() async {
final stream = () async* {
for (int i = 0; i < 5; i++) {
if (i == 3) {
throw "Error Test";
}
yield i;
}
}();
// handleErrorでエラーをインターセプト
stream.handleError(
// 以下onError関数では第1引数にエラーオブジェクト、第2引数でスタックトレースを受け取っている
(err, st) {
print("handleErrorメッセージ:$err");
print("handleErrorスタックトレース:$st");
},
// listenにエラー発生時の処理(onError:)を追加
).listen(print, onError: (e) {
print("onError:$e");
});
}
実行結果。
test:を省略したので、全てのエラーがhandleError()でインターセプトされる。
0
1
2
handleErrorメッセージ:Error Test
handleErrorスタックトレース:#0 main.<anonymous closure> (file:///Users/**********/app/dart/dev2/bin/dev2.dart:5:9)
<asynchronous suspension>
コメント