我在我们的项目中继承了如下所示的代码。它是类中的一个方法。
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 block 来捕获由于未能加载实例而导致的任何异常,例如InvalidOperationException,但是上面的代码我感觉不对。
InvalidOperationException不会被catch语句吞掉吗?如果记录有效,该 catch 语句还将捕获 _repository.Get 的潜在问题,以及属性设置的潜在问题。
我想我也许应该通过添加更多的 try catch 语句来重新构建它来分别处理 Get 操作和属性设置操作,或者添加更多的 catch block 来处理不同的异常,但我问了一位同事,他建议 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;
}
我想要一些第二意见,我才刚刚开始对异常处理感兴趣,所以我想确保我根据最佳实践以正确的方式进行处理。
最佳答案
当你这样做时:
catch (Exception)
{
throw;
}
您基本上没有处理异常。然而,这并不意味着您忽略它。 throw
语句会将异常向上传播到堆栈。为了清晰可读的代码,您的最终示例要好得多。
关于c# - 在 try block 而不是 catch block 中抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3414052/