Flutter集成sentry,全局异常捕捉。

3,879 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

sentry是一个错误监控和收集的工具,支持私有化部署,在很多android和ios项目中被使用。他可以在app发生异常时,自动补充异常情况,上传到服务端保存,可爱的coder可以根据收集到的错误信息,对app做出即时的处理。

个人开发者可以免费使用,公司或者企业有多种收费标准,根据企业情况自行选择吧。sentry收费标准

flutter集成sentry很简单,通过pub.dev能够很快的就找一个叫“sentry_flutter”的扩展,写这篇文章的时候,版本号是6.5.1。

插件地址:sentry_flutter

插件同时支持android,ios,linux,macos,web,windows,已经覆盖了flutter的所有平台了,likes数量有380个,POPULARITY有99%,数据上看是一个不错的插件。

版本更新也很快。

现在我们就使用sentry_flutter来实现flutter和sentry的集成。

注册sentry.io账号,并新建一个项目

注册sentry.io

如果是私有化部署了sentry可以跳过这步,直接去看#安装了。对于很多个人开发者还是使用云服务简单一些。首先通过官网来注册一个账号,注册地址传送,sentry支持通过google、github、azure devops账号登录。填写自己需要的信息一致下一步就行了。

设置简体中文

可以设置语言成简体中文,这样看着舒服点,选择语言以后刷新一下界面就能看到我们的母语啦。

添加项目

账号注册号以后,我们需要来添加一个项目,后续的异常情况都在这个项目中查看。

弄好账号以后就可以创建项目了,在左侧选择项目,就能看到创建项目的按钮。

  • 平台我们选择flutter,
  • 在set your default alert settings中选择Alert me on every new issue,对所有的异常进行报警。
  • 项目名称和团队根据自己情况选择。

点击创建项目后,我们稍等一会儿我们会看到一个Configure Flutter的界面,这里告诉我们如何和Flutter集成,包括异常的捕捉,还是对性能的监控,这是sentry的官方文档,让我们大致对后边的工作有个了解也是不错的。这里我们把这段代码复制一下。

设置密钥DSN

在菜单中选择设置-->项目,选择我们刚刚创建的项目,进入到项目的配置界面。

接下来在项目配饰菜单中选择客户端密钥(DSN),复制这里的DSN,后边会使用。

到此为止sentry我们就设置好了,来开始处理我们的flutter项目吧。

在Flutter项目中安装插件测试

我们新建一个测试项目来做测试。

flutter create sentry_test

添加sentry_flutter依赖

cd sentry_test
flutter pub add sentry_flutter

初始化sentry sdk

使用SentryFlutter.init来初始化SDK,在应用入口进行初始化工作。

看下边代码中的https://example@sentry.io/add-your-dsn-here部分,这里替换成刚刚在sentry中复制出来的dsn。

import 'package:flutter/widgets.dart';
import 'package:sentry_flutter/sentry_flutter.dart';

Future<void> main() async {
  await SentryFlutter.init(
    (options) {
      options.dsn = 'https://example@sentry.io/add-your-dsn-here';
    },
    // Init your App.
    appRunner: () => runApp(MyApp()),
  );
}

如果你使用zone来处理全局异常了,可以这样来初始化

import 'dart:async';

import 'package:flutter/widgets.dart';
import 'package:sentry_flutter/sentry_flutter.dart';

Future<void> main() async {
  runZonedGuarded(() async {
    await SentryFlutter.init(
      (options) {
        options.dsn = 'https://example@sentry.io/add-your-dsn-here';
      },
    );

    runApp(MyApp());
  }, (exception, stackTrace) async {
    await Sentry.captureException(exception, stackTrace: stackTrace);
  });
}

完成啦,就是这么简单,我们就完成了和sentry的集成,什么异常捕捉、堆栈处理、上传数据都不用做啦,sentry都已经帮我们做好了。

英文Dart有同步异常和异步异常的两个概念,我们就分别创建两个按钮,自己来触发两个异常,看看效果如何。

  • 同步异常
ElevatedButton(
  child: Text("一个同步异常"),
  onPressed: () {
    throw Exception("发生一个dart 同步异常");
  },
)
  • 异步异常
ElevatedButton(
  child: Text("一个异步异常"),
  onPressed: () {
    Future.delayed(Duration(seconds: 1)).then((e) {
      throw Exception('发生一个dart 异步异常');
    });
  },
)

\

分别点击两个按钮,然后回到sentye界面的问题页面去看一下吧,哈哈,没有意外的话,应该已经看到有两条异常信息啦。

在问题列表上可以看到很多筛选项目,还有很多信息:

  • 异常类的名称:_Exception
  • 异常出发的函数:main.dart in Main.build..
  • 异常携带的消息内容:Exception: 发生一个dart 异步异常
  • 异常的标签:New Issue
  • 异常出现的时间:5分 之前 | 5分 之后,鼠标悬停上去,可以看到首次出现的时间,和最后出现的时间。
  • 异常出现的次数:事件下边的数字就是异常出现的次数。
  • 有多少客户出现了这个异常:用户下边的数字就是有多少用户出现了这个异常。

点击卡片,我们还可以查看到异常的详细信息。在详细信息的界面上我们能得到更多的内容,包括客户设备型号,操作系统的版本,运行环境的信息。还有关键的堆栈信息。对我们解决异常有很大的帮助。默认是没有显示堆栈信息的,可以点击异常手边的全部标签,来显示所有的堆栈。

总结

基础的Flutter和sentry继承到这里就结束了,抛去sentry的注册等过程,其实使用起来是很方便的,flutter_sentry插件同时也带给我们很多其他的内容,有时间整理出来和大家分享。

源码地址

查看源码

演示视频

观看视频