Dart | Flutter 中的异常处理框架 Talker

1 概述

我们在应用程序的开发和支持过程中,会经常碰到异常。有些是我们期待的,有些是我们想也想不到的。作为一名程序员,能做的最糟糕的事情就是不去考虑捕捉和跟踪错误。让我们想想怎么做 ……

1.1 在Dart 里如何处理异常

例如,我们有这样的代码,用来处理某些服务的逻辑调用

final result = service.makeLogic();
print(result);

如果我们在服务中得到一个错误会发生什么?答案很简单: 程序崩溃并以错误结束。
在这里插入图片描述

应该避免这样的结果。要做到这一点,Dart 有一个 try-catch 结构。

String? result;
try {
  result = service.makeLogic();
} on Exception catch (e) {
  print(e);
}
result ??= 'Can`t get result';
print(result);

在这里插入图片描述
在这种情况下,程序将能够继续执行并正确终止。

1.2 异常跟踪

我们已经知道如何捕捉 bug,但是如何进行跟踪和错误分析呢?这里就要用到Talker库了。

2 如何使用 Talker

对于 Dart 应用程序,您需要在 pubspec.yaml 中添加 talker 依赖项

dependencies:
  talker: ^1.0.0

对于 Flutter 应用程序,你可以在 pubspec.yaml 中添加 talker_flutter 或 talker 依赖。

2.1 有什么不同?

  • talker_flutter 具有高级特性,可以方便地应用在 Flutter 程序里。比如 TalkerScreen 和 TalkerRouteObserver
  • talker 包可以同时运用到 Dart 和 Flutter 应用中。

2.2 易于使用

第一次启动,所需要的只是导入依赖项并创建 Talker 类的实例。

import 'package:talker/talker.dart';
void main(){
  final talker = Talker();
  talker.info('I`m alive 😄');
}

您可以在代码中的任何地方使用 Talker 实例,简洁的语法将帮助您完成这个任务。

final talker = Talker();
// Handle exceptions and errors
try {
  // your code...
} on Exception catch (e, st) {
  talker.handle(e, st, 'Exception in ...');
}

// Make logs
talker.log('App is started'),
talker.error('App is started'),
talker.waring('App is started'),

2.3 Flutter 初始化

runZonedGuarded onError() 回调中设置 Talker 实例,监听应用程序未捕获的异常。

void main() {
  final talker = Talker();
  runZonedGuarded(
    () => runApp(BaseEample(talker: talker)),
    (Object error, StackTrace stack) {
      talker.handle(error, stack, 'Uncaught app exception');
    },
  );
}

在这样的初始化之后,所有未捕获的错误和异常将被发送到 Talker 进行处理。

2.4 Observers

使用 Talker 库,您可以简化几个服务中的错误处理。代码由原来的的

 try {
    // your code...
  } on Exception catch (exception, stackTrace) {
    Crashlytics.instance
        .recordError(exception, stackTrace, reason: exception.message);
    Sentry.captureException(exception, stackTrace: stackTrace);
    YourOwnAnalytics.sendError(exception, stackTrace: stackTrace);
    ScaffoldMessenger.of(context)
        .showSnackBar(SnackBar(content: Text(exception.toString())));
    Logger.error('Something Service exception', exception, stackTrace);
  }

简化为

try {
  // your code...
} on Exception catch (e, st) {
    talker.handle(e, st, 'Something Service exception');
}

要将分析发送到其他服务,只需添加一个观察者

class ExceptionsAnalyticsTalkerObserver extends TalkerObserver {
  ExceptionsAnalyticsTalkerObserver();

  @override
  Function(TalkerException e) get onException => (e) {
        Crashlytics.instance
            .recordError(e.exception, stack: e.stackTrace, reason: e.message);
        Sentry.captureException(e.exception, stackTrace: e.stackTrace);
        YourOwnAnalytics.sendError(e.exception, stackTrace: e.stackTrace);
      };
}

然后在对话者的设置中实现这个观察者

final talker = Talker(
    observers: [
        ExceptionsAnalyticsTalkerObserver(),
    ],
);

现在所有的应用程序异常事件都将进入ExceptionsAnalyticsTalkerObserver 观察器,并被重定向到必要的服务,这不是很漂亮吗?

除此之外,Talker 还可以做很多其他的事情,比如定制日志,共享日志报告等等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孟华328

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值