Dart FutureクラスcatchError()メソッド

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

Dart FutureクラスのcatchError()メソッドについてメモ書き。

catchError()はFutureクラスのエラーをハンドリングするメソッド。
第1引数はエラーをキャッチした時に実行する処理、第2引数は名前付きオプション引数test:で省略可能。第2引数test:はbool型で、trueの時にcatchError()処理を実行する。falseの時はcatchError()を実行しない。デフォルトはtrue。

コーディングで動作を確認。
存在しないファイル「test.txt」の読み込みをreadAsString()で実行し、PathNotFoundExceptionを発生させる。
testで実行している「return error is PathNotFoundException」は、testの引数として受け取ったオブジェクト「error」が「PathNotFoundException」クラスの場合にtrueを返す。

import 'dart:io';

void main() {
  testFuture().then((value) {
    print(value);
  }).catchError(
    (e) {
      print(e.toString());
    },
    test: (error) {
      return error is PathNotFoundException;
    },
  );
}

Future<String> testFuture() async {
  try {
    var fileStr = await File("test.txt").readAsString();
    return fileStr;
  } catch (e) {
    rethrow;
  }
}

実行結果。
受け取ったエラーがPathNotFoundExceptionなのでcatchErrorが実行された。

PathNotFoundException: Cannot open file, path = 'test.txt' (OS Error: No such file or directory, errno = 2)

次は条件を否定型のis!(return error is! PathNotFoundException)に変更。この場合PathNotFoundExceptionにマッチしないのでfalseを返す。

import 'dart:io';

void main() {
  testFuture().then((value) {
    print(value);
  }).catchError(
    (e) {
      print(e.toString());
    },
    test: (error) {
      return error is! PathNotFoundException;
    },
  );
}

Future<String> testFuture() async {
  try {
    var fileStr = await File("test.txt").readAsString();
    return fileStr;
  } catch (e) {
    rethrow;
  }
}

実行結果。
実行が中断され「Unhandled exception」が返る。

Unhandled exception:
PathNotFoundException: Cannot open file, path = 'test.txt' (OS Error: No such file or directory, errno = 2)
#0      _checkForErrorResponse (dart:io/common.dart:55:9)
#1      _File.open.<anonymous closure> (dart:io/file_impl.dart:381:7)
<asynchronous suspension>
#2      _File.readAsString (dart:io/file_impl.dart:621:18)
<asynchronous suspension>
#3      testFuture
dev2.dart:18
<asynchronous suspension>
#4      main.<anonymous closure>
dev2.dart:10
<asynchronous suspension>

Exited (255)

最後は第2引数を指定せずに実行。

import 'dart:io';

void main() {
  testFuture().then((value) {
    print(value);
  }).catchError(
    (e) {
      print(e.toString());
    },
  );
}

Future<String> testFuture() async {
  try {
    var fileStr = await File("test.txt").readAsString();
    return fileStr;
  } catch (e) {
    rethrow;
  }
}

第2引数を指定しない場合はデフォルトtrueなのでcatchError()で例外処理が実行される。

PathNotFoundException: Cannot open file, path = 'test.txt' (OS Error: No such file or directory, errno = 2)

コメント

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