在 XMUX 的第一个公测版本发布前,我们就建立相关的测试群组以方便用户反馈遇到的问题和建议,并及时修复漏洞。然而在正式版本发布之后,我们仍然收到了许多来自同学们的问题反馈,然而在用户界面中出现的异常通常无法得到准确的描述和堆栈信息,这给我们排查漏洞带来的很大困难。
幸运的是,Flutter 引擎已经默认帮助我们收集了未处理异常并提供了统一处理这些异常的接口,通过给 FlutterError.onError 注册回调,这些异常就可以被手动处理,再配合 Sentry 即可实现自动地收集异常及其详细的堆栈信息。
首先,我们需要添加 Sentry 的 Dart 版客户端 并使用 DSN 进行初始化,DSN 可以在 Sentry 面板中找到。
import 'package:sentry/sentry.dart';
final sentry = SentryClient(dsn: 'DSN');
引入 flutter/fondation
并注册回调,这些异常信息将通过 Sentry 客户端进行上传。
import 'package:flutter/foundation.dart';
...
FlutterError.onError = (e) =>
sentry.captureException(exception: e.exception, stackTrace: e.stack);
...
但是在开发环境下,我们通常需要直接在控制台内输出异常信息以帮助开发者快速修复问题,而不希望将它们反馈至 Sentry 。通过 DartVM 的环境变量 dart.vm.product
, 我们可以判断当前是否处于生产模式,并仅在生产模式下注册异常收集回调。
...
if (bool.fromEnvironment('dart.vm.product'))
FlutterError.onError = (e) =>
sentry.captureException(exception: e.exception, stackTrace: e.stack);
...