错误上报
大约 2 分钟约 622 字
1. 功能描述
统一收集应用程序的运行时异常,将异常的关键信息(如异常来源、TraceId、异常堆栈等)发送至钉钉群机器人,以便开发人员及时发现问题并解决。
1.1. 异常分类
异常从大体上分为两类:「业务异常」和「程序异常」。错误上报模块仅针对「程序异常」进行处理。
1.1.1. 业务异常
由开发人员主动抛出的异常,如参数校验失败、业务逻辑异常等。
Kotlin
@Service
class UserService {
fun createUser(user: UserDto) {
if (xxx) {
throw BusinessException("用户名[${user.username}]已存在")
}
}
}Java
@Service
public class UserService {
public void createUser(UserDto user) {
if (xxx) {
throw new BusinessException("用户名[" + user.username + "]已存在");
}
}
}业务异常是「预料之内」的异常,不会影响系统的正常运行,因此不会被错误上报模块处理。
1.1.2. 程序异常
由程序BUG导致的异常,如空指针异常、数组越界异常等。通常来说,开发人员不会主动抛出此类异常。
程序异常是「预料之外」的异常,可能会导致系统的崩溃或数据丢失,因此需要及时发现并解决。
2. 快速开始
2.1. 引入依赖
Gradle(catalog)
dependencies {
// 提供全局异常拦截机制
implementation(commonLibs.blade.web.spring.boot.starter)
// 集成钉钉SDK
implementation(commonLibs.dingtalk.java.sdk)
}Maven
<dependencies>
<!-- 提供全局异常拦截机制 -->
<dependency>
<groupId>team.aikero.blade</groupId>
<artifactId>blade-web-spring-boot-starter</artifactId>
</dependency>
<!-- 集成钉钉SDK -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>alibaba-dingtalk-service-sdk</artifactId>
</dependency>
</dependencies>2.2. 创建钉钉群机器人
操作路径:点击钉钉群右上角「群设置」->「机器人」->「添加机器人」->「自定义」->「添加」,填写表单如下:

点击「完成」后,复制机器人的 Webhook 地址,格式如下:
https://oapi.dingtalk.com/robot/send?access_token=${access_token}将其中 ${access_token} 部分保存下来,后续的配置中会用到。
2.3. 配置文件
blade:
error-report:
strategy: DING_TALK_ROBOT
ding-talk-robot:
# 将这里的 ${access_token} 替换为上一步中保存的值
access-token: ${access_token}2.4. 测试一下
在代码的任意位置抛出一个异常(注意:不能是 BusinessException)
Kotlin
@RestController
class UserController {
@PostMapping("/users")
fun createUser(user: UserDto) {
if (true) {
throw NullPointerException("测试空指针异常")
}
}
}Java
@RestController
public class UserController {
@PostMapping("/users")
public void createUser(UserDto user) {
if (true) {
throw new NullPointerException("测试空指针异常");
}
}
}钉钉群机器人会收到一条异常信息,如下:

