c# - 在 try block 而不是 catch block 中抛出异常?

标签 c# exception-handling

我在我们的项目中继承了如下所示的代码。它是类中的一个方法。

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/

相关文章:

c# - "URI formats are not supported."异常刚刚开始出现在非常旧的、未更改的代码中

python - 处理 urllib2.URLError 时获取 URL

exception-handling - 为什么我应该在 Sitecore 中使用 Assert.IsNull?

java - 我在这里滥用日志级别的想法吗?

python - Rethinkdb python 处理空结果

c# - ListViewItem IsSelected Binding - 适用于 WPF,但不适用于 WinRT

c# - Azure Web App 中的 nuget 更新后 Web API 返回 HttpResponseMessage 对象

c# - Presenter 的依赖注入(inject)

c# - 删除在 ASP.NET MVC 中经过身份验证的用户

c# - 尽管拥有正确的 NuGet 包,为什么我仍然需要在计算机上安装 MySQL 连接器?