1. Exception
- Exception 代表程序正常运行过程中可以预料到的意外情况,应该被开发者捕获并进行相应处理。
2. Error
- Error 指在正常情况下不太可能出现的情况。
- 大部分 Error 导致程序处于不正常、不可恢复的状态,所以不便也不需被开发者捕获,因为这个情况下你捕获了也无济于事。
3. Throwable
- Exception 和 Error 都是继承自
Throwable
类。 - 在Java代码中,只有继承自
Throwable
的实例可以被throw
或catch
。
4. 注意事项
4.1 捕获特定的异常
- 避免捕获通用的
Exception
异常,而应该捕获特定的异常。
软件工程是一门协作的艺术,在日常的开发中我们有义务使自己的代码能更直观、清晰的表达出我们想要表达的信息。
但是如果你什么异常都用了Exception,那别的开发同事就不能一眼得知这段代码实际想要捕获的异常,并且这样的代码也会捕获到可能你希望它抛出而不希望捕获的异常。
4.2 不要“吞”了异常
- 捕获异常后,应将异常信息输出到日志,不要仅仅使用
e.printStackTrace()
。
如果我们捕获了异常,不把异常抛出,或者没有写到日志里,那会出现什么情况?线上除了bug莫名其妙的没有任何的信息,你都不知道哪里出错以及出错的原因。
这可能会让一个简单的bug变得难以诊断,而且有些同学比较喜欢用catch之后用e.printStackTrace(),在我们产品中通常不推荐用这种方法,一般情况下这样是没有问题的但是这个方法输出的是个标准错误流。
比如是在分布式系统中,发生异常但是找不到stacktrace。
所以最好是输入到日志里,我们产品可以自定义一定的格式,将详细的信息输入到日志系统中,适合清晰高效的排查错误。
4.3 不要延迟处理异常
- 应在方法开始时尽早检查并处理可能的异常,避免深层调用后再处理。
比如你有个方法,参数是个name,函数内部调了别的好几个方法,其实你的name传的是null值,但是你没有在进入这个方法或者这个方法一开始就处理这个情况,而是在你调了别的好几个方法然后爆出这个空指针。
这样的话明明你的出错堆栈信息只需要抛出一点点信息就能定位到这个错误所在的地方,经过了好多方法之后可能就是一坨堆栈信息。
4.4 只在必要的范围内使用 try-catch
- 尽量缩小 try-catch 的范围,避免影响JVM对代码的优化。
只要必要的代码段使用try-catch,不要不分青红皂白try住一坨代码,因为try-catch中的代码会影响JVM对代码的优化,例如重排序
4.5 不要通过异常来控制程序流程
- 使用条件语句(如 if/else)而不是异常来控制程序流程。
一些可以用if/else的条件语句来判断例如null值等,就不要用异常,异常肯定是比一些条件语句低效的,有CPU分支预测的优化等。而且每实例化一个Exception都会对栈进行快照,相对而言这是一个比较重的操作,如果数量过多开销就不能被忽略了。
4.6 不要在 finally 代码块中处理返回值
- 避免在 finally 块中使用
return
或处理返回值,以免覆盖 try 块中的返回或屏蔽异常。
在 finally 中 return或者处理返回值会让发生很诡异的事情,比如覆盖了try中的return,或者屏蔽的异常。
标签:Exception,Java,捕获,try,Error,catch,异常,代码 From: https://blog.csdn.net/Alfred_tfk/article/details/141024019