自定义异常

Java标准库定义的常用异常包括:

  1. Exception
  2. ├─ RuntimeException
  3. ├─ NullPointerException
  4. ├─ IndexOutOfBoundsException
  5. ├─ SecurityException
  6. └─ IllegalArgumentException
  7. └─ NumberFormatException
  8. ├─ IOException
  9. ├─ UnsupportedCharsetException
  10. ├─ FileNotFoundException
  11. └─ SocketException
  12. ├─ ParseException
  13. ├─ GeneralSecurityException
  14. ├─ SQLException
  15. └─ TimeoutException

当我们在代码中需要抛出异常时,尽量使用JDK已定义的异常类型。例如,参数检查不合法,应该抛出IllegalArgumentException

  1. static void process1(int age) {
  2. if (age <= 0) {
  3. throw new IllegalArgumentException();
  4. }
  5. }

在一个大型项目中,可以自定义新的异常类型,但是,保持一个合理的异常继承体系是非常重要的。

一个常见的做法是自定义一个BaseException作为“根异常”,然后,派生出各种业务类型的异常。

BaseException需要从一个适合的Exception派生,通常建议从RuntimeException派生:

  1. public class BaseException extends RuntimeException {
  2. }

其他业务类型的异常就可以从BaseException派生:

  1. public class UserNotFoundException extends BaseException {
  2. }
  3. public class LoginFailedException extends BaseException {
  4. }
  5. ...

自定义的BaseException应该提供多个构造方法:

  1. public class BaseException extends RuntimeException {
  2. public BaseException() {
  3. super();
  4. }
  5. public BaseException(String message, Throwable cause) {
  6. super(message, cause);
  7. }
  8. public BaseException(String message) {
  9. super(message);
  10. }
  11. public BaseException(Throwable cause) {
  12. super(cause);
  13. }
  14. }

上述构造方法实际上都是原样照抄RuntimeException。这样,抛出异常的时候,就可以选择合适的构造方法。通过IDE可以根据父类快速生成子类的构造方法。

练习

下载练习:从BaseException派生自定义异常 (推荐使用IDE练习插件快速下载)

小结

抛出异常时,尽量复用JDK已定义的异常类型;

自定义异常体系时,推荐从RuntimeException派生“根异常”,再派生出业务异常;

自定义异常时,应该提供多种构造方法。

读后有收获可以支付宝请作者喝咖啡,读后有疑问请加微信群讨论

自定义异常 - 图1自定义异常 - 图2