我们为什么要用Java编写自定义异常类

时间:2013-03-19 06:49:10

标签: java oop exception

编写自定义异常类的目的是什么,当它的作用大多相同时。 例如,NullPointerException

class NullPointerException extends RuntimeException {
      private static final long serialVersionUID = 5162710183389028792L;


      public NullPointerException() {
          super();
      }


      public NullPointerException(String s) {
          super(s);
      }
}

这是我见过和创建的大多数异常类的基本模板。

我能想到的一个目的是处理这些异常。但是这不能基于异常消息吗?我们主要为每种异常类型编写单个处理代码。我知道这有“例外”。

但还有什么呢?这不是重复自己只有班级名称改变的地方吗?

还有任何JDK Exception类有一些代码吗?

6 个答案:

答案 0 :(得分:7)

我可以想到几个原因:

  • 拥有多个异常类允许程序员在其catch子句中具体化,并且只捕获他们关心的异常并知道如何处理。
  • 异常类可以携带有关导致异常的错误的信息。例如,ArrayIndexOutOfBoundsException携带有问题的数组索引,SQL异常往往带有特定于数据库的错误代码和消息。
  • 异常规范 - 列出异常 - 可用于在编译时检查正确性。

答案 1 :(得分:2)

嗯,简单地说,如果你不需要特殊的异常类,你就不应该制作一个。如果你这样做,那你就做一个。真的没有魔力。

如果您正在创建一个库,那么您当然应该从使用该库的开发人员的角度思考(即使只是您):您的库是否因特定原因而抛出异常和< / em>库用户可能想要专门捕获这些,因为他们可以切实地做一些事情(只是记录不够合理,IMO)。

标准异常类的示例:方法的调用者可能希望将IndexOutOfBoundsException转换为null返回值,同时让其他异常正常传播。

如果希望以默认方式处理自定义异常,则可以扩展现有的异常类,例如IOException。然后,当您想要在那里执行特定操作时,您可以捕获特定的IO异常,但当您不需要特殊处理时,可以像任何其他IOException一样处理它(可以'做任何有用的事情来恢复)。

如果你有一个完全自定义的异常,它永远不会被超类catch捕获,它总是应该有特定的catch块,那么你可以直接扩展Exception

我认为很少需要扩展RuntimeException,因为如果它被捕获的异常应该是Exception子类,如果它意味着结束程序或只是生成日志输出,然后它应该由具有自定义消息字符串的默认RuntimeException实现覆盖。

答案 2 :(得分:1)

  1. 我们可以自由地在Exception类中添加更多方法,这有助于客户端像rootCauseOfException(),description(),solution(),advice()等。 可以参考以下链接:
    https://stackoverflow.com/a/22698673

  2. 如果您的项目具有相互依赖的模块,那么您也可以在同一个依赖关系层次结构中维护异常层次结构,这样如果您在基础层中捕获单个Exception,那么将捕获所有相互依赖的模块异常。

  3. 您还可以在发送到客户端之前屏蔽一些敏感数据,如IP,端口等。如果不使用自定义异常,则某些敏感数据可能会泄漏到slient。

  4. 您可以提供自己的异常消息,客户可以轻松理解,而不是有时可能难以理解的java异常消息。

答案 3 :(得分:0)

基本上以不同的方式处理不同的异常。比如说,你可能想对ArrayIndexOutOfBoundsException做一些不同于NumberFormatException的操作。

或更清楚

}catch (ArrayIndexOutOfBoundsException ex){
//operation 1
}catch (NumberFormatException ex){
//operation 2
}

答案 4 :(得分:0)

主要目的是识别自定义/特定于应用程序的错误。您还可以在那里提供一些其他方法。例如,我们有自定义异常,它们返回自定义消息,并从堆栈跟踪中提取原因和位置。

答案 5 :(得分:0)

您需要让您的客户端代码知道代码的哪一部分发生了什么确切的异常。所以你需要让异常语义和区别于其他代码块。

如何做到这一点:

  1. 定义新的异常类,因此类名称告诉发生了什么
  2. 定义一个unifed / generic异常类,它包含codemessage或其他信息。 code可以说明发生了什么。
  3. 总结一下,做一些事情让你的异常具有一些意义/语义,并让它的客户知道到底发生了什么。