【问题标题】:Is there a situation when it's appropriate to use empty catch block? [duplicate]是否有适合使用空 catch 块的情况? [复制]
【发布时间】:2011-06-09 04:31:33
【问题描述】:

可能的重复:
Why are empty catch blocks a bad idea?
Is there any valid reason to ever ignore a caught exception

你知道空catch块不是绝对邪恶的情况吗?

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

【问题讨论】:

  • catch 块总是邪恶的,除非与空 try 块一起使用。
  • 空的catch 块并不总是邪恶的。空的 all-match catch 块总是邪恶的。
  • @Frédéric Hamidi,您的评论被接受为答案

标签: c# .net exception-handling try-catch catch-block


【解决方案1】:

这方面有很多问题,试试看:

Why are empty catch blocks a bad idea?

来自该帖子的已接受答案:

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

这相当于将黑色胶带贴在发动机警告灯上。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 然而...我可以向您展示包含一个空 catch 块的完全合理的代码。一个空的 catch 块并不意味着“什么都不做”。
    • 不,一个空的 catch 块意味着,出了点问题,我不知道是什么,但忽略它并继续。 VB 6 有一个“On Error Resumed Next”命令会自动为您执行此操作,并且很高兴调试包含它的代码。
    • 如果控件在方法完成之前被释放,并且调用该方法的唯一原因是让控制知道它应该重绘自己吗?我几乎不会认为这样的事件值得记录。可以肯定的是,空的 catch 块确实表明存在编码缺陷,但缺陷是缺少 TryBeginInvoke 方法。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      公理:

      空的 catch 块是绝对邪恶的

      不要试图解决这个问题。仅仅通过试图找到它们不是绝对邪恶的案例就意味着你在浪费宝贵的大脑周期。不要试图在这里找到模式,想“嗯,我应该在这里放一个空的 catch 块吗?”

      如果您在某人的代码中偶然发现了一个空的 catch 块,那么您就是偶然发现了technical debt。修理它。即使只是在一个空的 catch 块中添加一个日志语句,你也会让这个世界变得更美好。

      【讨论】:

        【解决方案5】:

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

        证明空catch块的例子

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

        【讨论】:

        • 但是在这种情况下我们是否仍然谈论空渔获物?在这种情况下,您正在设置返回值。
        • @ChristopheLambrechts:添加示例以证明 catch 块将为空。
        • 在这种情况下,我会将return false; 语句放在catch 块中。
        • 这是一个典型的令人烦恼的异常。详情请见Vexing exceptions | Fabulous Adventures In Coding
        猜你喜欢
        • 2010-12-09
        • 2011-12-25
        • 2015-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-16
        • 1970-01-01
        相关资源
        最近更新 更多