Dart Streamクラスerrorコンストラクタ

Dar言語StreamクラスtoSet()メソッドDart

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)

完了

コメント

タイトルとURLをコピーしました