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 还可以做很多其他的事情,比如定制日志,共享日志报告等等。