-
一、前言
-
二、异常介绍
-
2.1 认识异常
-
2.2 Java异常的分类
-
2.3 异常的处理流程
-
2.4 异常抛出与捕获的原则
-
2.5 认识try/catch/finally
-
-
三、异常处理
-
3.1 处理异常的最佳实践
-
3.2 转转异常监控和上报的实践
-
3.3 ASM+javaAgent实现异常信息的统一上报
-
-
四、总结
一、前言
在我们的日常工作中,总会出现各种各样的“错误”和突发的“异常”。无论我们做了多少准备,多少测试,这些异常总会在某个时间点出现,如果处理不当或是不及时,往往还会导致其他新的问题出现。所以我们要时刻注意这些陷阱以及需要一套“最佳实践”来建立起一个完善的异常处理机制。那么我们如何快速、准确地定位异常的发生的地方,和一些简易的异常信息方便研发定位问题?下面跟随我来看一下转转中台是如何优雅地对异常进行统一的监控和上报处理的。
二、异常介绍
2.1 认识异常
程序在运行时,发生了意料之外的事情,阻止了程序的正常执行,这种情况被称为异常。出现异常后,往往需要人工介入处理,否则会扩大异常的影响面。通常处理异常时,需要解决以下3个问题:
-
哪里发生异常?
-
谁来处理异常?
-
如何处理异常?
2.2 Java异常的分类
JDK中有一套完整的异常机制,所有异常都是Throwable的子类,分为Error(致命异常)和 Exception(非致命异常)。
Error是一种非常特殊的异常类型,他的出现标识着系统发生了不可控的错误,如:StackOverflowError、OutOfMemoryError,程序无法处理,只能人工介入处理
Exception又分为 checked异常 (受检异常)和 uncheck异常 (非受检异常),checked异常是需要代码中显式处理,否则编译会报错。uncheck异常是运行时异常,他们都继承RuntimeException,不需要程序进行显式的捕捉和处理。
2.3 异常的处理流程
2.4 异常抛出与捕获的原则
-
非必要不使用异常
-
使用描述性消息抛出异常
-
力所能及的异常一定要处理
-
异常忽略要有理有据
2.5 认识try/catch/finally
说到异常处理,这里就不得不提try/catch/finally。try不可以单独存在,要么搭配catch,要么搭配finally,或者三者并存。1、try代码块:监视代码块的执行,发现对应的的异常则跳转至catch,若无catch则直接到finally块。2、catch代码块:发生对应的异常会执行里面的代码,要么处理,要么向上抛出。3、finally代码块:不管是否有异常,都必执行,一般用来清理资源,释放连接等。然而有以下几种情况不会执行到这里的代码。
-
代码执行流程未进入try代码块。
-
代码在try代