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)
コメント