在Java中如何以及在何处定义自己的Exception层次结构?

Eug*_*neP 30 java exception try-catch

在Java中如何以及在何处定义自己的Exception层次结构?

我的主要问题涉及必须定义Exception类的包位置.

我们是否为异常创建了一个特殊的包并将所有类放在其中?

Chr*_*ail 29

我将此作为一般规则使用.

  • 在有意义的地方,使用预定义的Java异常.例如,如果您的代码有某种I/O错误,则可以抛出IOException.
  • 如果需要区分try/catch块中的两个异常,则仅使用异常层次结构.很多时候,让单个组件抛出一个异常类型,并针对不同的错误使用不同的消息是完全正确的.如果用户无法真正做任何事情来专门处理错误,请使用相同的通用异常类.如果用户能够以不同方式处理它们,那就是应该使用层次结构.
  • 对于层次结构,不要使来自不同组件的所有异常都从基本异常继承.没有真正的理由这样做.如果消费者想要抓住任何东西,他们可以简单地捕获异常.
  • 对于包位置,我将Exception类与其相关的代码放在一起.所以,如果我在一个包abc中有一个BusinessService,我就会有一个abcBusinessException.我不喜欢将所有异常放入异常包中.这让人很难找到.


Jim*_*ley 12

我将所有自定义异常放入com.company.project.exception包中.我这样做而不是把它们"靠近"它们出现的位置.

这是我的推理:如果给定的异常仅在一个或两个服务类中出现,那么它可能不是一个足够的例外来配置它自己的类.只有当我看到在多个地方弹出一个共同的主题时,我才会遇到创建自定义Exception类的麻烦.如果它在多个地方弹出,那么没有逻辑包来"附加"它,所以特定于异常的包似乎是正确的方法.


Eti*_*nne 5

您可以随时随地创建Exception类.

重要的是扩展现有的Exception类(java.lang.Throwable实际上).例如java.lang.Exceptionjava.lang.RuntimeException.第一个是检查异常,而扩展RuntimeException将导致未经检查的异常; 这里详细介绍了两者之间的差异.