Java 捕获所有异常,Throwable V.S. Exception
- Java
- 2017-08-03
- 408热度
- 0评论
我在设计器项目源码中加了一个小功能。有一天,我写的这部分代码报错,导致模板无法保存。老大说:不管过程中出现任何异常,都不应该影响模版保存。
那就在最外层加个 try/catch,捕获所有异常。代码如下:
private void xxxFunc() {
if (openTime == 0) {
return;
}
long saveTime = System.currentTimeMillis(); // 保存模板的时间点
try {
tic.xxxF(template, this, openTime, saveTime);
} catch (Exception ex) { // 不管xxx过程中出现任何异常,都不应该影响模版保存
}
openTime = saveTime; // 更新 openTime,准备下一次计算
}
提交 pr 的时候,有个代码审查。老大评论了:
什么?Throwable 是啥?(一脸懵逼)
然后查找了下资料。简单说,Throwable 是最顶层的可抛出对象,比 Exception 的层级更高。为了不让任何异常影响程序运行,此处用 Throwable 更好。
Java 异常体系
- Throwable: Java中所有异常和错误类的父类。只有这个类的实例(或者子类的实例)可以被虚拟机抛出或者被java的throw关键字抛出。同样,只有其或其子类可以出现在catch子句里面。
- Error: Throwable的子类,表示严重的问题发生了,而且这种错误是不可恢复的。
- Exception: Throwable的子类,应用程序应该要捕获其或其子类(RuntimeException例外),称为checked exception。比如:IOException, NoSuchMethodException...
- RuntimeException: Exception的子类,运行时异常,程序可以不捕获,称为unchecked exception。比如:NullPointException.
修改代码如下:
private void xxxFunc() {
if (openTime == 0) {
return;
}
long saveTime = System.currentTimeMillis(); // 保存模板的时间点
try {
tic.xxxF(template, this, openTime, saveTime);
} catch (Throwable th) { // 不管xxx过程中出现任何异常,都不应该影响模版保存
}
openTime = saveTime; // 更新 openTime,准备下一次计算
}