我在设计器项目源码中加了一个小功能。有一天,我写的这部分代码报错,导致模板无法保存。老大说:不管过程中出现任何异常,都不应该影响模版保存。 那就在最外层加个 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,准备下一次计算
}