我只是想知道你对在哪里定义、抛出和捕获异常有什么看法,看看是否有关于考虑的共识。
让我举一个例子。假设我有解决方案,在该解决方案中我有 2 个项目:DomainProject
和ControllerProject
.
在 DomainProject 中,我有一个用于执行某些查询的存储库,例如,
RepositoryClass
我有以下方法:GetObjectById(int id) { ... }
我在这个项目中定义了一些异常,比如
ObjectNotFoundException
.在
ControllerProject
我想查询我的存储库中,所以我做了一些看起来像这样的事情:MyObject obj = repo.GetObjectById(11);
现在的问题是谁应该负责检查 id 是否确实存在。如果您选择 ControllerProject 应该检查 id 的存在,您最终会得到如下代码:
MyObject obj = repo.GetObjectById(11);
if (obj == null) {throw new ObjectNotFoundException();}
但不利的一面是它往往在使用的地方都是重复的GetObjectById
。当然,在某些情况下,您不会关心是否获得空值,因此不直接在 DomainProject 中抛出异常以某种方式是合法的。但我首先不喜欢重复 if 测试,其次,与我的问题更相关,我不喜欢在当前项目之外使用异常定义。
我觉得应该只在定义它的项目中抛出异常,而其他项目应该只捕获它们。
回到我的例子,我将如何解决这种情况。一个简单的想法是在我的域项目中定义 2 方法。一个抛出异常,一个不抛出异常。我唯一不确定的是我必须使用哪种命名约定:GetObjectByIdThrowsIfNotFound()
和GetObjectById()
. 或者我可以只添加一个可选参数GetObjectById(int id, bool isExceptionThrow = true)
。
您如何看待异常?
谢谢