2020/6/7 Futures and error handling

The Future API and callbacks

FutureAPIの関数は、Futureがcompleteした時の値(あるいはエラー)を処理するコールバック関数を登録します。例えば、

myFunc().then(processValue)
        .catchError(handleError);

then()メソッドのコールバックはFutureが値と共にcompleteした時に実行されます。

catchError()メソッドのコールバックは、Futureがエラーと共にcompleteした時に実行されます。

上記の例では、myFunc()関数の返り値のFutureインスタンスが値と共にcompleteした時、then()メソッドのコールバック(processValue)が実行されます。もしthen()メソッドの中で新たなエラーが発生しない場合、catchError()のコールバックは実行されません。一方で、もしmyFunc()関数がエラーと共にcompleteした場合、then()メソッドのコールバック実行されません。そしてcatchError()メソッドのコールバックが実行されます。


Examples of using then() with catchError()

then()メソッドとcatchError()メソッドをつなげて記述する方法は、Futureを処理する上でよくあるパターンです。そしてそれはtry-catch文と同じように考えることができます。

この後のいくつかのサンプルではこのパターンを見ていきます。

catchError() as a comprehensive error handler

下のサンプルはthen()メソッドのコールバックの中でエラーがスローされて、catchError()でエラーハンドリングする場面です。

myFunc()
  .then((value) {
    doSomethingWith(value);
    ...
    throw("some arbitrary error");
  })
  .catchError(handleError);

もしmyFunc()関数のFutureが値と共にcompleteしたら、then()メソッドのコールバックが実行されます。もしthen()メソッドのコールバックがエラーをスローしたら(上記のサンプルではそうなります)、then()メソッドが返すFutureがエラーと共にcompleteします。そのエラーはcatchError()メソッドで処理されます。

もしmyFunc()関数のFutureがエラーと共にcompleteしたら、then()メソッドが返すFutureもエラーと共にcompleteします。そのエラーもcatchError()メソッドで処理されます。

myFunc()関数内でスローされたエラーも、then()のコールバック内でスローされたエラーも、どちらもcatchError()メソッドにより処理されます。


Error handling within then()

then()メソッドの引数onErrorにコールバックを設定して、Futureがエラーと共にcompleteした場合のエラー処理を行うこともできます。

onError引数にコールバックを渡す

 

 

 

 

 

参考

https://dart.dev/guides/libraries/futures-error-handling

コメントを残す

メールアドレスが公開されることはありません。