Exception 和 Error
都继承了 Throwable 类。
Exception和Error的区别
- error 为错误,exception 为异常 :
Error的出现,意味着程序出现了严重的问题,⽽这些问题不应该再交给 Java 的异常处理机制来 处理,程序应该直接崩溃掉,⽐如说OutOfMemoryError Exception的出现,意味着程序出现了⼀些在可控范围内的问题,我们应当采取措施进⾏挽救。
NoClassDefFoundError:程序在编译时可以找到所依赖的类,但是在运⾏时找不到指定的类⽂件,导致抛出该错误;原因可能是 jar 包缺失或者调⽤了初始化失败的类。
ClassNotFoundException:当动态加载 Class 对象的时候找不到对应的类时抛出该异常;原因可能是要加载的类不存在或者类名写错了。
在没有 try-with-resources 之前,finally 块常⽤来关闭⼀些连接资源,⽐如说 socket、数据 库链接、IO 输⼊输出流等
try-with-resources
Java 7 引入的一项重要语法糖
核心目的是自动释放外部资源,彻底告别繁琐且容易出错的 finally 手动关闭代码。资源类必须实现 java.lang.AutoCloseable 或 java.io.Closeable 接口
异常处理的实践
- 尽量不要捕获
**RuntimeException**:尽量不要 catch RuntimeException,⽐如 NullPointerException、 IndexOutOfBoundsException 等等,应该⽤预检查的⽅式来规避。 - 尽量使⽤
**try-with-resource**来关闭资源 - 不要捕获 Throwable
- 不要省略异常信息的记录
- 不要记录了异常⼜抛出了异常
- 不要在 finally 块中使⽤ return
- 抛出具体定义的检查性异常⽽不是 Exception
- 捕获具体的⼦类⽽不是捕获 Exception 类
- ⾃定义异常时不要丢失堆栈跟踪
MyServiceException("Some information: " , e) - finally 块中不要抛出任何异常
- 不要在⽣产环境中使⽤
printStackTrace() - 对于不打算处理的异常,直接使⽤
try-finally,不⽤catch - 记住早
**throw**晚**catch**原则:“早 throw, 晚 catch” 是 Java 中的⼀种异常处理原则。这个原则指的是在代码中尽可能早地抛出 异常,以便在异常发⽣时能够及时地处理异常。同时,在 catch 块中尽可能晚地捕获异常,以便 在捕获异常时能够获得更多的上下⽂信息,从⽽更好地处理异常。 - 只抛出和**⽅法**相关的异常
- 切勿在代码中使⽤异常来进⾏流程控制
- 尽早验证⽤户输⼊以在请求处理的早期捕获异常
- ⼀个异常只能包含在⼀个⽇志中
- 将所有相关信息尽可能地传递给异常
- 终⽌掉被中断线程
- 对于重复的 try-catch,使⽤模板⽅法