永不捕捉的例外
本文关键字: | 更新日期: 2023-09-27 18:32:17
我知道有些异常类型无法在 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.EntityUtil.IsCatchableExceptionType(Exception) in System.Data.Entity, version=3.5.0.0
我想知道哪些其他例外是不明智的,或者与不良做法有关。
以下是不应捕获的所有异常的列表:
- 任何您不知道如何处理的异常
以下是异常处理的最佳做法:
如果您不知道如何处理异常,请不要抓住它。
这听起来可能很尖刻,但它们都是正确的,这就是你需要知道的。
这样做通常不是一个好主意。
您应该尽可能捕获最具体的异常,并且仅在安全的情况下继续执行程序。 例如,如果您正在打开文件,则捕获与文件访问/权限错误相关的异常是完全合理的,但可能没有其他异常。你当然不会想抓住一个OutOfMemoryException
然后盲目地继续前进。它们是非常不同的错误!
捕获的内容的一揽子规则,则无法保证您的程序能够安全地继续执行,因为您没有响应特定情况,仅应用一种尺寸并不适合所有解决方案。
在catch
块中使用 Exception
将捕获所有可捕获的异常。我想说的是,您应该只指定需要捕获的异常,并让您不想捕获的异常溢出。例如
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
}
不会捕获该列表中的任何其他异常
好的,我们已经确定这不是一个好主意。我们已经确定,SO上的程序员更喜欢从他们的高马中发表意见,而不是递给你一把刀来刺伤自己,所以对于那些有自杀倾向的人,让我们从这些开始:
(编辑了我的名单,并干掉了SO指向汉斯的名单)
https://stackoverflow.com/a/5508733/17034