Java 捕获所有异常,Throwable V.S. Exception

我在设计器项目源码中加了一个小功能。有一天,我写的这部分代码报错,导致模板无法保存。老大说:不管过程中出现任何异常,都不应该影响模版保存。

那就在最外层加个 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,准备下一次计算
    }