Dart Futureクラスのthen()メソッドについてメモ書き。
then()はFutureの実行結果を受け取るメソッド。
第1引数は受け取った戻り値に対する処理を記述する。第2引数は名前付きオプション引数「onError:」で、エラーメッセージとStackTraceの2つを受け取り例外処理を実行する。第2引数はオプション引数なので省略可能。
Dart公式は「Futureのコールバック処理をthen()メソッド、例外処理をcatchError()メソッドと分けて記述した方が可読性が高い」としているので、例外処理はcatchError()メソッドを推奨しているようだ。
例外処理の注意点については「Dart Futureクラス概要とコンストラクタ」を参照の事。
Dart Futureクラス概要とコンストラクタ
Futureは非同期処理を扱うためのクラス。非同期処理はasync関数で行う。
then()メソッドをコーディングで確認。
「test.txt」ファイルを読み込み、内容をprint()メソッドで出力する。
import 'dart:io';
void main() {
testFuture().then((value) {
print(value);
}, onError: (err, stck) {
print("Error:$err");
print("StackTrace:$stck");
});
}
Future<String> testFuture() async {
try {
var readTest = await File('test.txt').readAsString();
return readTest;
} catch (e) {
rethrow;
}
}
実行結果。
ファイル内容が出力された。
TestThen1
TestThen2
次に存在しないファイルを指定し、エラーを発生させる。
import 'dart:io';
void main() {
testFuture().then((value) {
print(value);
}, onError: (err, stck) {
print("Error:$err");
print("StackTrace:$stck");
});
}
Future<String> testFuture() async {
try {
var readTest = await File('no_test.txt').readAsString();
return readTest;
} catch (e) {
rethrow;
}
}
実行結果。
Error:PathNotFoundException: Cannot open file, path = 'no_test.txt' (OS Error: No such file or directory, errno = 2)
StackTrace:#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 (file:///Users/***********/app/dart/dev2/bin/dev2.dart:14:20)
<asynchronous suspension>
#4 main.<anonymous closure> (file:///Users/***********/app/dart/dev2/bin/dev2.dart:4:21)
<asynchronous suspension>
最後に省略可能な「onError:」を削除し、代わりにcatchError()メソッドを使って例外処理を実行。
import 'dart:io';
void main() {
testFuture().then(
(value) {
print(value);
},
).catchError((err, stck) {
print("Error:$err");
print("StackTrace:$stck");
});
}
Future<String> testFuture() async {
try {
var readTest = await File('no_test.txt').readAsString();
return readTest;
} catch (e) {
rethrow;
}
}
実行結果。
Error:PathNotFoundException: Cannot open file, path = 'no_test.txt' (OS Error: No such file or directory, errno = 2)
StackTrace:#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 (file:///Users/*************/app/dart/dev2/bin/dev2.dart:16:20)
<asynchronous suspension>
コメント