美文网首页
Dart中的catchError捕获顺序

Dart中的catchError捕获顺序

作者: o动感超人o | 来源:发表于2018-12-28 11:34 被阅读44次

    先贴一下该方法的源码:

      /**
       * Handles errors emitted by this [Future].
       *
       * This is the asynchronous equivalent of a "catch" block.
       *
       * Returns a new [Future] that will be completed with either the result of
       * this future or the result of calling the `onError` callback.
       *
       * If this future completes with a value,
       * the returned future completes with the same value.
       *
       * If this future completes with an error,
       * then [test] is first called with the error value.
       *
       * If `test` returns false, the exception is not handled by this `catchError`,
       * and the returned future completes with the same error and stack trace
       * as this future.
       *
       * If `test` returns `true`,
       * [onError] is called with the error and possibly stack trace,
       * and the returned future is completed with the result of this call
       * in exactly the same way as for [then]'s `onError`.
       *
       * If `test` is omitted, it defaults to a function that always returns true.
       * The `test` function should not throw, but if it does, it is handled as
       * if the `onError` function had thrown.
       *
       * Note that futures don't delay reporting of errors until listeners are
       * added. If the first `catchError` (or `then`) call happens after this future
       * has completed with an error then the error is reported as unhandled error.
       * See the description on [Future].
       */
      // The `Function` below stands for one of two types:
      // - (dynamic) -> FutureOr<T>
      // - (dynamic, StackTrace) -> FutureOr<T>
      // Given that there is a `test` function that is usually used to do an
      // `isCheck` we should also expect functions that take a specific argument.
      // Note: making `catchError` return a `Future<T>` in non-strong mode could be
      // a breaking change.
      Future<T> catchError(Function onError, {bool test(Object error)});
    

    翻译一下主要的意思,就是这个catchError方法可以捕获其他Futrue的异常信息,如果重写了test方法,test返回true就可以在catchError的onError方法里捕获到异常,如果test返回false,就把该异常继续抛出而不会在catchError方法里被捕获,如果不写test默认实现一个返回true的test方法,注意catchError只能捕获Future的异常,而不能捕获同步代码的异常,测试代码如下:

    import 'dart:async';
    
    Future testFutureError() {
      return new Future(() {
        throw "error";//1
    //    return "abc";//2
      });
    }
    
    main() {
      testFutureError().then((value) {
        print("then " + value);
      }).catchError((e) {
        print("catchError " + e);
      }, test: (Object o) {
        print("test " + o);
        return true;//3
    //    return false;//4
      }).catchError((e) {
        print("catchError2 " + e);
      }, test: (_) => true);
    }
    

    如果是上面的代码,会输出

    test error
    catchError error
    

    因为//3这行返回了true,所以会在第一个catchError里被捕获。
    如果//4不注释了,把//3注释,那么第一个catchError不能捕获该异常,该异常会继续抛出,然后在第二个catchError里被捕获。具体的可自行测试。

    还有就是用whenComplete方法的时候,不是所有then都执行完再执行whenComplete方法,而是then、catchError、whenComplete这些方法会按照顺序(除非中途有异常会进入下一个catchError)执行,这一点和rxjava+retrofit不一样,原生开发请知悉。

    相关文章

      网友评论

          本文标题:Dart中的catchError捕获顺序

          本文链接:https://www.haomeiwen.com/subject/bxdslqtx.html