Dart StreamクラスhandleError()メソッド

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

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>

コメント

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