美文网首页
flutter 全局异常捕获

flutter 全局异常捕获

作者: 李小轰 | 来源:发表于2021-07-05 16:23 被阅读0次

    dart开发中,try-catch使用方式:

    //捕获同步异常
    try {
          ...
        } catch (e) {
          print("try-catch error : $e");
        }
    
    //捕获异步异常
    Future.error("error").catchError((e) {
          print("try-catch error : $e");
        });
    

    我们使用如上方式,在关键代码处对Flutter进行异常捕获。不过,还有部分异常是在我们没有考虑到的场景下发生的,这些我们没有做埋点处理的异常如何捕获呢?

    直接给出异常捕获模板:
    void main() {
      void reportErrorAndLog(FlutterErrorDetails details) {
        final errorMsg = {
          "exception": details.exceptionAsString(),
          "stackTrace": details.stack.toString(),
        };
        print("reportErrorAndLog : $errorMsg");
        ...//上报错误
      }
    
      FlutterErrorDetails makeDetails(Object error, StackTrace stackTrace) {
        // 构建错误信息
        return FlutterErrorDetails(stack: stackTrace, exception: error);
      }
    
      FlutterError.onError = (FlutterErrorDetails details) {
        //获取 widget build 过程中出现的异常错误
        reportErrorAndLog(details);
      };
      runZonedGuarded(
        () {
          runApp(MyApp());
        },
        (error, stackTrace) {
          //没被我们catch的异常
          reportErrorAndLog(makeDetails(error, stackTrace));
        },
      );
    }
    
    关键点说明:
    • runZonedGuarded函数给执行对象制定了一个zone,zone 可理解是一个代码执行沙箱,它能捕获所有未处理的异常(包括同步与异步异常)。
    • FlutterError.onError是一个静态函数,可捕获Widget在build阶段发生的错误异常,我们对其进行重写,把异常信息进行上报处理。

    相关文章

      网友评论

          本文标题:flutter 全局异常捕获

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