https://dart.dev/guides/libraries/library-tour#dartasync---asynchronous-programming
上記ページのエラー処理の説明を読んでいるんですが、
Important: Be sure to invoke catchError() on the result of then()—not on the result of the original Future. Otherwise, the catchError() can handle errors only from the original Future’s computation, but not from the handler registered by then().
上記の説明なんですが、これは例えば
//sample1 Future<String> one() => new Future.value("from one1"); Future<String> twoOne() => new Future.error("error from 21"); Future<void> main() async { one() .catchError( (e){ print("エラー内容 : $e"); } ); } /* (何も表示されない) */
sample1の呼び出し方だと、one()が返すfutureのエラーしかキャッチできませんよ。(上記コードではone()でエラーは出ないので、エラー内容は何も表示されませんが)
しかし
//sample2 Future<String> one() => new Future.value("from one1"); Future<String> twoOne() => new Future.error("error from 21"); Future<void> main() async { one() .then( (_){ print("one completed"); twoOne(); } ) .catchError( (e){ print("エラー内容 : $e"); } ); } /* one completed */
sample2のように呼び出せば、thenのコールバックの中で発生したエラー(つまりtwoOne()のエラー)もcatchError()メソッドで捕捉できますよ。
という説明ではないんでしょうか?そうとしか読めないんですが。
でも実際動かしてみると
one completed
しか表示されません。これって
twoOne()
で発生したエラーがcatchError()メソッドで捕捉されていないと思うのですが。
これって何なんでしょうか。仕様が変わったけどドキュメントに反映されていない、みたいなことなんでしょうか。