【发布时间】:2010-11-24 07:10:47
【问题描述】:
嘿:)
有没有办法在全局范围内捕获 handled 异常?我知道我们可以使用“AppDomain.CurrentDomain.UnhandledException”和“Application.ThreadException”捕获未处理的异常,但我想为我已经捕获的异常添加一些处理(例如写入日志等)
谢谢
【问题讨论】:
标签: c# exception exception-handling
嘿:)
有没有办法在全局范围内捕获 handled 异常?我知道我们可以使用“AppDomain.CurrentDomain.UnhandledException”和“Application.ThreadException”捕获未处理的异常,但我想为我已经捕获的异常添加一些处理(例如写入日志等)
谢谢
【问题讨论】:
标签: c# exception exception-handling
通常,您可能希望在代码中尽可能低的级别捕获异常。与异常发生的位置越接近,您就越有可能解决导致它们的问题。
如果您无法在此级别采取任何纠正措施以解决导致异常的问题,那么您根本不应该处理它 em>. 让异常冒泡,然后在全球范围内随心所欲地处理它。
话虽如此,如果您在较低级别处理异常,您能够在较高级别捕获它的唯一方法是,如果您rethrow it 来自较低级别的 Catch 块。
因此,例如:
try
{
//your code
}
catch (SomeException e)
{
//take any relevant handling measures
//rethrow the exception
throw;
}
当然,这在技术上意味着该异常在较低级别的 Try/Catch 块中未处理,但这是在较高级别捕获任何东西的唯一方法级别。
有关重新抛出异常的更多信息,请参阅:
【讨论】:
您可以重新抛出相同的异常并在调用模块/日志模块中捕获它,然后记录它。 例如:
private void DivideByZero()
{
try
{
int x = 2/0;
}
cath(Exception ex)
{
Console.Writeline(ex.ToString());
throw;
}
}
void Main(string[] a)
{
try
{
DivideByZero();
}
catch(Exception x)
{
// write logging code here ..
}
}
【讨论】:
不,没有全局异常事件。那将是非常危险的,您会从其他模块中捕获各种不供公众使用的内部异常。它还可能会在异常情况下淹没您的日志。
您应该更加结构化地处理异常以达到相同的效果。封装异常的实际处理,在实际的 catch 块中做最少的工作。通过在某个地方使用“HandleException”方法,您也可以传递每个异常。您还可以查看 Enterprise 库中的 Exception Handling block。
【讨论】: