你知道有哪些情况下,空的catch块不是绝对的恶?
可能的重复问题:
为什么空的catch块是个坏主意?
是否有任何有效的理由忽略捕获的异常?
try
{
...
// What and When?
...
}
catch { }
你知道有哪些情况下,空的catch块不是绝对的恶?
可能的重复问题:
为什么空的catch块是个坏主意?
是否有任何有效的理由忽略捕获的异常?
try
{
...
// What and When?
...
}
catch { }
关于这个问题有很多疑问,可以看一下:
从那个帖子的被接受的答案中可以看到:
通常情况下,空的try-catch是一个坏主意,因为你在默默地忽略错误条件,然后继续执行。偶尔这可能是正确的做法,但通常它表明开发人员看到了异常,不知道该怎么办,所以使用一个空的catch来消除问题。
这相当于在引擎警告灯上贴黑色胶带的程序等效。
我认为你至少应该提供一些注释或记录信息,表明在try {}中放置的内容抛出了异常,这就是为什么你什么也没做的原因。
我在一些自己编写的库中使用它,其中我需要某种形式的bool TrySomething(out object)
函数或object TrySomething()
函数,而底层调用没有提供任何其他机制作为异常。在这种情况下,我使用一个空的catch块并返回false
或null
(取决于函数签名)。
public bool TrySomething(out object destination)
{
try
{
destination = DoSomething();
return true;
}
catch
{}
return false;
}
return false;
语句放置在catch块中。 - Christophe Lambrechts看一下this,它基本上将你可能遇到的异常类型分为四类,其中没有一个应该由空的catch块处理。
Control.BeginInvoke
中抛出这种烦人的异常时,catch块应该执行什么操作?我几乎不认为这种情况值得记录日志。当然,空的catch块确实表明了编码缺陷,但缺陷在于缺少TryBeginInvoke
方法。 - supercat空的catch块是绝对的恶魔
不要试图绕过这个问题。试图找到它们不是绝对恶魔的情况只会浪费宝贵的脑力。不要试图在这里找到一个模式,思考“嗯,我应该在这里放一个空的catch块吗?”
如果你在别人的代码中遇到了一个空的catch块,那么你刚刚发现了技术债务。修复它。即使只是在空的catch块内添加一个日志记录语句,你也会让这个世界变得更美好。
catch
块通常是有问题的,除非它们与空的try
块一起使用。 - Frédéric Hamidicatch
语句块并不总是有害的,但空的“全匹配”(all-match)catch
语句块总是有害的。 - Ben Voigt