我知道有些异常类型无法在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
答案 0 :(得分:14)
我想知道哪些其他例外不值得捕捉,或者与不良做法有关。
以下列出了您不应该捕获的所有例外情况:
以下是异常处理的最佳做法:
如果您不知道如何处理异常,请不要抓住它。
这可能听起来很讽刺,但它们都是正确的,这就是你需要知道的全部。
答案 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的名单)