在哪个命名空间/包中放置异常

时间:2010-04-27 11:40:48

标签: c# java exception namespace-organisation package-structuring

构建异常类位置的常见或最佳做法是什么?

假设您有包/名称空间myproject.person(人员的模型和DAO)和myproject.order(订单的模型和DAO)以及例外PersonExceptionOrderException 。我应该将异常放在相应的包中,还是放在单独的包中以用于例外(例如myproject.exceptions)?

第一种方法似乎更合理(因为它按功能排序)。但是问题出在哪里你应该放置与两者相关的例外?例如一个ConstraintViolationException

由于

7 个答案:

答案 0 :(得分:12)

根据我的经验,最好将异常放入对该异常有意义的包中。我不会仅为异常创建一个特殊的包 - 异常应该存在于使用它们的类附近。

答案 1 :(得分:12)

执行Java类库的功能。将异常放在与抛出它们的API类和接口相同的包中。

答案 2 :(得分:8)

我会将它们放在与其对应的类相同的命名空间中。对于更常见的异常类型,您应该尝试将它们放在覆盖使用它们的类的最特定的命名空间中,因此ConstraintViolationException将放在myproject命名空间中。

答案 3 :(得分:1)

如果异常仅用于一个类或功能组的类,则将它放在它们附近。如果Exception具有应用程序jr库的通用含义,请将其放在其oun名称空间中。 IMHO

答案 4 :(得分:1)

想象一下,每个程序集都有自己的操作,以及许多类型的异常(不仅仅是 PersonException OrderException ,而是 PersonInvalidDataException PersonDataPersistException )。 例如,这些异常可以实现BaseException,即记录和发送电子邮件。

所以更实惠的方式(在我看来)是用名称空间分隔它们。

答案 5 :(得分:0)

我只保留项目命名空间中的所有异常(即myproject)。如果你为每个类创建一个文件,它们可以占用项目视图中的空间,所以我通常调用文件(例外).cs以便它们出现在顶部,并将所有的例外放在一个地方。

如果它是一个大项目,那么通常会将程序集分解为不同的名称空间,每个名称空间将获得自己的一组异常,但我们每个程序集都会讨论100多个类。

答案 6 :(得分:0)

我对整个想法的问题是,异常通常应该根据可能出错的方式设计,例如NullPointerException,而PersonException似乎是指任何涉及的对象灾难正在展开而没有提供出错的线索。 Person对象是否导致异常?是因为Person有内部逻辑问题,还是因为其中一个方法提供了错误的参数?或者由于在数据库中找不到人员而导致例外?

你对这两个对象的例外情况有两种看法,这只会加强我的担忧。我建议重新考虑你的异常设计(EntityNotFoundException,BadArgumentException,MinorCannotOrderPornException),你的困境的答案有望更明显。