5

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

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

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.EntityUtil.IsCatchableExceptionType(Exception) in System.Data.Entity, Version=3.5.0.0

4

4 回答 4

17

我想知道哪些其他异常是不可取的,或者与不良做法有关。

以下是您不应捕获的所有异常的列表:

  1. 任何你不知道如何处理的异常

这是异常处理的最佳实践:

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

这可能听起来很尖刻,但它们都是正确的,这就是你需要知道的。

于 2013-09-22T22:19:44.380 回答
2

Exception在块中使用catch将捕获所有可捕获的异常。我会说你应该只指定需要捕获的异常,并让那些你不想捕获的异常溢出。例如

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
}

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

于 2013-09-22T22:23:16.323 回答
2

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

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

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

于 2013-09-22T22:27:03.803 回答
0

好的,所以我们已经确定这不是一个好主意。而且我们已经确定,SO 上的程序员更喜欢从他们的高大上发表意见,而不是给你一把刀来刺自己,所以对于那些有自杀倾向的人,让我们从这些开始:

(编辑了我的列表并干燥了所以指向汉斯的列表)

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

于 2017-10-25T17:42:58.283 回答