什么情况下可以使用空的 catch 块?

12

10
空的catch块通常是有问题的,除非它们与空的try块一起使用。 - Frédéric Hamidi
4
空的 catch 语句块并不总是有害的,但空的“全匹配”(all-match)catch 语句块总是有害的。 - Ben Voigt
@Frédéric Hamidi,您的评论已被接受为答案。 - bniwredyc
5个回答

7

关于这个问题有很多疑问,可以看一下:

为什么空的catch块是一个坏主意?

从那个帖子的被接受的答案中可以看到:

通常情况下,空的try-catch是一个坏主意,因为你在默默地忽略错误条件,然后继续执行。偶尔这可能是正确的做法,但通常它表明开发人员看到了异常,不知道该怎么办,所以使用一个空的catch来消除问题。

这相当于在引擎警告灯上贴黑色胶带的程序等效。


2

我认为你至少应该提供一些注释或记录信息,表明在try {}中放置的内容抛出了异常,这就是为什么你什么也没做的原因。


1

我在一些自己编写的库中使用它,其中我需要某种形式的bool TrySomething(out object)函数或object TrySomething()函数,而底层调用没有提供任何其他机制作为异常。在这种情况下,我使用一个空的catch块并返回falsenull(取决于函数签名)。

证明空catch块的示例

public bool TrySomething(out object destination)
{
    try
    {
        destination = DoSomething();
        return true;
    }
    catch
    {}

    return false;
}

但在这种情况下,我们仍然可以称之为空的catch吗?在这种情况下,您正在设置返回值。 - Christophe Lambrechts
@ChristopheLambrechts:添加了一个示例来证明catch块将为空。 - Oliver
2
在这种情况下,我会将return false;语句放置在catch块中。 - Christophe Lambrechts
1
这是一个典型的令人烦恼的异常。有关详细信息,请参见Vexing exceptions | Fabulous Adventures In Coding - Stéphane Gourichon

1

看一下this,它基本上将你可能遇到的异常类型分为四类,其中没有一个应该由空的catch块处理。


然而,我可以向您展示包含空catch块的完全合理的代码。 空catch块并不意味着“什么也不做”。 - Ben Voigt
不,一个空的 catch 块意味着出了问题,我不知道是什么,但只需忽略它并继续。VB 6 有一个“On Error Resumed Next”命令,可以自动为您执行此操作,这对于调试代码非常方便。 - SWeko
如果控件在方法执行完成之前被释放,而调用该方法的唯一原因是让控件知道它应该重新绘制自己,那么在Control.BeginInvoke中抛出这种烦人的异常时,catch块应该执行什么操作?我几乎不认为这种情况值得记录日志。当然,空的catch块确实表明了编码缺陷,但缺陷在于缺少TryBeginInvoke方法。 - supercat

1
公理:

空的catch块是绝对的恶魔

不要试图绕过这个问题。试图找到它们不是绝对恶魔的情况只会浪费宝贵的脑力。不要试图在这里找到一个模式,思考“嗯,我应该在这里放一个空的catch块吗?”

如果你在别人的代码中遇到了一个空的catch块,那么你刚刚发现了技术债务。修复它。即使只是在空的catch块内添加一个日志记录语句,你也会让这个世界变得更美好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接