java.lang.Exception vs. roll your own exception

2022-09-01 16:43:48

在什么时候你会创建自己的异常类,而不是使用java.lang.Exception?(一直以来?只有当它将在包装之外使用时?只有当它必须包含高级逻辑时?等等...)


答案 1

我认为你需要问自己一个完全不同的问题:“创建新异常会给我或使用我的代码的开发人员带来什么好处?实际上,它给你或其他人带来的唯一优势是处理异常的能力。这似乎是一个显而易见的答案,但实际上并非如此。您只应处理可以合理地从中恢复的异常。如果您抛出的异常是一个真正致命的错误,为什么给开发人员一个错误处理它的机会呢?

更深入的讨论:自定义异常:何时应创建它们?


答案 2

原因一:

需要抓住特定的东西。如果调用代码需要处理特定的异常情况,则需要区分异常,而 Java 会区分不同类型的异常,因此您需要编写自己的异常。

基本上,如果有人必须写:

catch(ExistingException e) {
  if({condition}) {
    { some stuff here}
  }
  else {
    { different stuff here}
  }
}

你可能想写一个特定的扩展;catch 异常匹配比条件匹配更清晰,恕我直言。

请记住:您的新异常可以是 RuntimeException 的子类

原因二:

API 整合。如果你写了一个接口,并且你有几个实现,那么它们可能会调用不同的API,并抛出一大堆不同的非运行时异常:

interface MyInterface {
  void methodA();
}

class MyImplA {
  void methodA() throws SQLException { ... }
}

class MyImplB {
  void methodA() throws IOException { ... }
}

你真的希望MyInterface.methodA抛出SQLException和IOException吗?也许这样,将可能的异常包装在自定义异常中是有意义的。这又可以是一个运行时异常。甚至是运行时异常本身...