从不捕获的例外情况

时间:2013-09-22 22:15:25

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

我知道有些异常类型无法在catch块中捕获,例如.NET 2.0中的StackOverflowException。我想知道哪些其他例外不适合捕获,或者与不良做法有关。

我想使用这个异常类型列表的方法是每次在catch块中使用Exception时检查它:

private static readonly Type[] _exceptionsToNotCatch = new Type[] { typeof(StackOverflowException) };

// This should never throw, but should not swallow exceptions that should never be handled.
public void TryPerformOperation()
{
    try
    {
        this.SomeMethodThatMightThrow();
    }
    catch (Exception ex)
    {
        if (_exceptionsToNotCatch.Contains(ex.GetType()))
            throw;
    }
}

修改

我认为我没有提供一个很好的例子。在尝试传达一个人的意思时,试图让一个例子微不足道的问题就是其中之一。

我自己从不抛出异常,并且我总是捕获特定的异常,只捕获异常,如下所示:

try
{
    this.SomeMethodThatMightThrow();
}
catch (SomeException ex)
{
    // This is safe to ignore.
}
catch (Exception ex)
{
    // Could be some kind of system or framework exception, so don't handle.
    throw;
}

我的问题更像是一个学术问题。只有系统抛出哪些异常并且永远不会被捕获?我担心的情况更像是这样:

try
{
    this.SomeMethodThatMightThrow();
}
catch (OutOfMemoryException ex)
{
    // I would be crazy to handle this!
    // What other exceptions should never be handled?
}
catch (Exception ex)
{
    // Could be some kind of system or framework exception, so don't handle.
    throw;
}

这个问题的确受到以下方面的启发: System.Data.Entity中的System.Data.EntityUtil.IsCatchableExceptionType(Exception),Version = 3.5.0.0

4 个答案:

答案 0 :(得分:14)

  

我想知道哪些其他例外不值得捕捉,或者与不良做法有关。

以下列出了您不应该捕获的所有例外情况:

  1. 您不知道如何处理的任何例外
  2. 以下是异常处理的最佳做法:

    如果您不知道如何处理异常,请不要抓住它。

    这可能听起来很讽刺,但它们都是正确的,这就是你需要知道的全部。

答案 1 :(得分:2)

Exception块中使用catch将捕获所有可捕获的异常。我会说你应该只指定需要捕获的异常,让你不想捕获的异常溢出。 E.g。

try
{

}
catch(SqlException sqlex)  //specific to database calls
{
   //do something with ex
}
catch(FormatException fex) //specific to invalid conversion to date, int, etc
{
   //do something with ex
}
catch(Exception ex)
{
    //I didn't know this exception would be thrown
    //log it for me or Rethrow it
}

不会捕获该列表中不存在的任何其他异常

答案 2 :(得分:2)

这样做通常不是一个好主意。

您应该捕获可能的最具体的异常,并且只在安全的情况下执行您的程序。例如。如果你打开一个文件,捕获与文件访问/权限错误有关的异常是完全合理的,但可能不是很多。你当然不想抓住OutOfMemoryException,然后盲目地继续。他们的错误非常不同!

如果你应用了一个关于要捕获的内容的一揽子规则,则无法保证您的程序能够安全地继续执行,因为您没有对特定情况作出响应,仅应用一个尺寸并不适合所有解决方案。

答案 3 :(得分:0)

好的,所以我们确定它不是一个好主意。而且我们已经确定,SO上的程序员更愿意从他们的高马中选择而不是用刀来刺伤自己,所以对于那些有自杀倾向的人,让我们从这些开始:

(编辑我的清单并干预SO以指向Hans的名单)

https://stackoverflow.com/a/5508733/17034