问题 是否有适合使用空挡块的情况? [重复]


可能重复:
为什么空捕获阻止了一个坏主意?
是否有任何有效理由忽略捕获的异常 

你知道任何情况下空的挡块不是绝对的邪恶吗?

try
{
    ...
    // What and When?
    ...
}
catch { }

5508
2018-01-14 14:27


起源

空 catch 块永远是邪恶的,除非与空使用 try 块。 - Frédéric Hamidi
空 catch 街区并不总是邪恶的。空 百搭 捕获块总是邪恶的。 - Ben Voigt
@FrédéricHamidi,您的评论被接受为答案 - bniwredyc


答案:


关于此问题有很多问题,请试着看看:

为什么空捕获阻止了一个坏主意?

从该帖子的接受答案:

通常空的try-catch是个坏主意,因为你正在静默地吞下错误条件然后继续执行。有时这可能是正确的做法,但通常这表明开发人员看到了异常,不知道该怎么做,因此使用空捕获来解决问题。

它的编程相当于将黑色胶带放在发动机警告灯上。


7
2018-01-14 14:29





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


1
2018-01-14 14:33



然而......我可以向你展示包含空捕获块的完全合理的代码。空捕获块并不意味着“什么都不做”。 - Ben Voigt
不,一个空的捕获块意味着,出了点问题,我不知道是什么,但只是忽略它并继续。 VB 6有一个“On Error Resumed Next”命令会自动为你做这个,并且很高兴用它来调试代码。 - SWeko
应该在catch块中为引发的烦恼异常做些什么 Control.BeginInvoke 如果在方法完成之前控件被释放,并且调用方法的唯一原因是让控件知道它应该重绘自己?我几乎不认为这样的事情值得记录。可以肯定的是,空捕获块确实表明存在编码缺陷,但缺陷是缺少a TryBeginInvoke方法。 - supercat


我会说你至少应该提供某种评论或记录消息,表明你在try {}中放入的内容引发了异常,这就是你没有做任何事情的原因。


1
2018-01-14 14:33





公理:

空抓块绝对是邪恶的

不要试图找到解决方法。只是试图找到他们不是绝对邪恶的案例意味着你在浪费宝贵的大脑周期。不要试图在这里找到一个模式,想“嗯,我应该把空挡块放在这里吗?”

如果你在某人的代码中偶然发现一个空的陷阱,你只是偶然发现了 技术债务。修理它。即使只是在一个空的catch块中添加一个日志语句,你也会让这个世界变得更加美好。


1
2018-01-14 14:37





我用它来做一些自编的库,我需要一些东西 bool TrySomething(out object) 功能还是 object TrySomething() 底层调用不提供任何其他机制作为例外。在这种情况下,我使用一个空的catch块并返回 false 要么 null (取决于功能签名)。

证明空捕获块的示例

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

    return false;
}

1
2018-01-14 14:34



但是,在这种情况下,我们仍然会谈论一个空的捕获吗?在这种情况下,您正在设置返回值。 - Christophe Lambrechts
@ChristopheLambrechts:添加了一个例子来证明catch块是空的。 - Oliver
在那种情况下,我会放置 return false; catch块中的语句。 - Christophe Lambrechts
这是一个典型的烦恼例外。看到 烦恼的例外|编码中的神话般的冒险 详情。 - Stéphane Gourichon