【发布时间】:2011-03-25 18:01:13
【问题描述】:
我在我们的项目中继承了如下所示的代码。它是一个类中的一个方法。
protected override bool Load()
{
DataAccess.SomeEntity record;
try
{
record = _repository.Get(t => t.ID.Equals(ID));
if (record == null)
{
throw new InvalidOperationException("failed to initialize the object.");
}
else
{
this.ID = record.ID;
// this.OtherProperty = record.SomeProperty;
// etc
}
}
catch (Exception)
{
throw;
}
return true;
}
如果我随后从我的 UI 层调用此 Load 方法,我可能希望有一个 try catch 块来捕获因加载实例失败而导致的任何异常,例如InvalidOperationException,但上面的代码对我来说感觉不对。
InvalidOperationException 不会被 catch 语句吞掉吗?如果记录有效,该 catch 语句还将捕获 _repository.Get 的潜在问题,以及属性设置的潜在问题。
我想我可能应该通过添加更多try catch语句来分别处理Get操作和属性设置操作来重组它,或者添加更多处理不同异常的catch块,但我问了一位同事,他建议try catch是在这种情况下无关紧要,应完全删除,如下所示:
protected override bool Load()
{
DataAccess.SomeEntity record;
record = _repository.Get(t => t.ID.Equals(ID));
if (record == null)
{
throw new InvalidOperationException("failed to initialize the object.");
}
else
{
this.ID = record.ID;
// this.OtherProperty = record.SomeProperty;
// etc
}
return true;
}
我想要一些第二意见,我才刚刚开始对异常处理感兴趣,所以我想确保我按照最佳实践以正确的方式进行操作。
【问题讨论】:
-
你的同事是对的。两个版本都一样,那为什么不减少代码呢?
-
我建议将 throw 留在调试中 - 使用那段代码,您可以在 throw 上放置一个断点,然后然后检查异常(在即时窗口中使用
$exception)。当您不确定到底会出现什么时,这样做很有用,并且正如其他海报所说的那样,否则它没有任何效果。
标签: c# exception-handling