忽略异常类型的更好方法:多个catch块与类型查询

HuB*_*eZa 2 .net c# exception-handling

在某些情况下,我们希望忽略特定的异常类型(通常ObjectDisposedException).可以通过这两种方法实现:

try
{
    // code that throws error here:
}
catch (SpecificException) { /*ignore this*/ }
catch (Exception ex)
{
    // Handle exception, write to log...
}
Run Code Online (Sandbox Code Playgroud)

要么

try
{
    // code that throws error here:
}
catch (Exception ex)
{
    if (ex is SpecificException) { /*ignore this*/ }
    else
    {
        // Handle exception, write to log...
    }
}
Run Code Online (Sandbox Code Playgroud)

这两种方法的优点和缺点是什么(关于性能,可读性等)?

tda*_*ers 6

我主要是说这是一个偏好的问题,但专用的emtpy catch对我来说看起来更干净.读取代码的程序员可以假设熟悉try/catch构造,并且他们希望您将catch块从特定到一般进行排序.人们阅读try/catch构造的通常方式是浏览捕获,直到找到与他们正在寻找的匹配的东西(就像编译器那样),然后看看它做了什么.阅读器无论如何都是这样做的,所以当你有一个专门的空捕获的异常类型时,很明显它是一个特殊情况,并且你正在丢弃异常.内置类型检查逻辑OTOH要求读者找到更一般的异常分支,它可能在catch块列表中,然后读取实际逻辑以找出发生的情况.我要说这需要比空捕获更多的阅读努力.

另一点是,你应该有理由忽略异常; 对于一个空的catch块,对于你和那些检查你的代码的人来说,你会忽略错误,这是很明显的 - 这很好 - 这意味着人们会注意到并且对这种潜在的陷阱有更多的意识,你会被推动添加一个解释为什么你这样做的评论.如果你将ignore-this-exception部分隐藏在处理程序逻辑中,人们可能会读过它然后想知道为什么他们的异常不会弹出任何地方.