异常应该放在单独的包中吗?

Posted

技术标签:

【中文标题】异常应该放在单独的包中吗?【英文标题】:Should Exceptions be placed in a separate package? 【发布时间】:2010-10-23 22:35:41 【问题描述】:

我正在承担一个项目,其中所有异常都放在一个单独的包com.myco.myproj.exceptions 中。

这是好的做法吗?

【问题讨论】:

【参考方案1】:

在我看来,问题在于您希望文件系统强调的内聚类型。

将异常与异常、服务与服务、常量与常量等分组称为Logical Cohesion,一般认为是弱类型的内聚。

根据事物对单一且明确定义的任务(例如usermanagementauthentication)的贡献对事物进行分组称为功能凝聚力,被认为比逻辑更强大且更可取凝聚。在此模型中,与用户管理相关的异常将与其他专用于用户管理的类一起进入 usermanagement 包。在这个模型中,我们根据功能角色对事物进行分组,而不是根据它们的实体“种类”——例如“例外”。

所以是的,我也将汤姆霍廷的答案加倍。这不是一个好的做法。

要了解更多关于凝聚力的信息,一些来源是geeksforgeeks 和wikipedia。如果您想进一步研究这个概念,我相信您也可以找到其他来源的音调。

【讨论】:

【参考方案2】:

这将是一个不好的做法,并且会导致不必要的包间依赖。自定义异常类应始终定义在与能够抛出它的类相同的包中。您应该尽量减少创建在整个应用程序中使用的自定义异常,因为使用 Exception。自定义异常,顾名思义就是自定义异常,应该专注于特定的部分。这对于自定义实用程序类应该是相同的。

包应该能够呈现单个功能单元。有关示例,请参阅 this。 将被抛出的自定义异常是该功能单元的一部分,并且应该在同一个包中

例如:

// Below should be in a single package
interface Draggable
abstract class Graphic
class Circle extends Graphic implements Draggable
class Box extends Graphic implements Draggable
final class GraphicValidator // utility  class
// don't put below in a separate 'exceptions' package, 
// who's gonna use it anyway other than the components in this package ?
class GraphicRenderingException extends Exception

【讨论】:

除非您是 java.* 提交者,否则不适合抛出 Exception 或 RuntimeException。 @TimP 你能详细说明一下吗?【参考方案3】:

这是一种不好的做法。

这是一个巧合的分组。包应该是连贯的。不要将异常、接口、枚举、抽象类等分组到自己的包中。而是将相关概念分组。

【讨论】:

【参考方案4】:

我希望包中存在包的异常。例如

com.oopsconsultancy.models.pricing

将包含定价模型和相关的例外情况。其他任何事情似乎都有点违反直觉。

【讨论】:

+1:异常与导致异常的事物位于同一位置。

以上是关于异常应该放在单独的包中吗?的主要内容,如果未能解决你的问题,请参考以下文章

我应该将公共接口放在单独的文件中吗?

当你在 MySQL 或 PostgreSQL 中有一个 TEXT 字段时,你应该把它放在一个单独的表中吗?

Dubbo 实例程序

Dubbo 实例程序

Dubbo服务化最佳实践

为测试创建一个单独的包