我将此作为一般规则。
- 在适当的地方,使用预定义的Java异常。例如,如果您的代码有某种I / O错误,则抛出IOException是可以的。
- 仅当需要在try / catch块中区分两个异常时,才使用异常层次结构。很多时候,让单个组件抛出具有不同消息,针对不同错误的单个异常类型是非常好的。如果用户真的不能做任何事情来专门处理错误,请使用相同的通用异常类。如果用户能够以不同的方式处理它们,那就应该使用层次结构。
- 对于层次结构,请勿使来自不同组件的所有异常都继承自基本异常。没有真正的理由这样做。如果消费者想要捕获任何东西,他们可以简单地捕获Exception。
- 对于包的位置,我放置了一个Exception类及其相关的代码。因此,如果我在abc包中有一个BusinessService,则要有一个abcBusinessException。我不喜欢将所有异常放入异常包中。这只是很难找到。



