Dart Streamクラスのerrorコンストラクタについてメモ書き。
errorはStreamが完了する前にエラーイベントを発生させるコンストラクタ。
errorコンストラタの第1引数にはエラーメッセージを指定する。第2引数はオプション引数(省略可能)としてスタックトレースを指定する。後述するコーディング例を見てもらうと分かるが、スタックトレースを出力するとエラーの発生箇所が明確になる。
以下はリスナー(listen)が単純に配列strのデータを受け取るコード。
void main() {
Stream<String> stream;
try {
stream = () async* {
List<String> str = ["a", "b"];
for (String s in str) {
yield s;
}
}();
} catch (e, s) {
stream = Stream<String>.error(e, s);
}
stream.listen(
(data) {
print('データ: $data');
},
onError: (err, stackTrace) {
print('エラー: $err');
print('スタックトレース: $stackTrace');
},
onDone: () {
print('完了');
},
);
}
実行結果。配列strのデータを表示した後、onDone:で処理を完了している。
データ: a
データ: b
完了
次に意図的にエラーを出力してみる。
void main() {
Stream<String> stream;
try {
stream = () async* {
List<String> str = ["a", "b"];
for (String s in str) {
yield s;
}
}();
// 意図時にエラーをスローする。
throw FormatException('フォーマットエラー');
} catch (e, s) {
stream = Stream<String>.error(e, s);
}
stream.listen(
(data) {
print('データ: $data');
},
onError: (err, stackTrace) {
print('エラー: $err');
print('スタックトレース: $stackTrace');
},
onDone: () {
print('完了');
},
);
}
実行結果。リスナーのonError:でtry catch文にあるStream.error(e, s)からエラーメッセージとスタックトレースを受け取り処理を実行している。最後にonDone:で処理を完了する。
エラー: FormatException: フォーマットエラー
スタックトレース: #0 main (file:///Users/*******/app/dart/dev2/bin/dev2.dart:11:5)
#1 _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:296:19)
#2 _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:189:12)
完了
コメント