嘿:)
有没有办法全局捕获处理的异常?我知道我们可以使用“AppDomain.CurrentDomain.UnhandledException”和“Application.ThreadException”捕获未处理的异常,但我想对我已捕获的异常(例如写入日志等)添加一些处理
感谢
答案 0 :(得分:4)
通常,您可能希望在代码中以尽可能低的级别捕获异常。它们越接近异常发生的位置,你就越有可能解决造成它们的问题。
如果您无法在此级别采取任何纠正措施,希望解决导致异常的问题,那么您根本不应该处理它。只要让异常冒泡,就可以按照自己的意愿全局处理。
话虽如此,如果你已经处理较低级别的异常,你能够在更高级别捕获它的唯一方法就是如果你rethrow it 来自较低级别的Catch
区块。
所以,例如:
try
{
//your code
}
catch (SomeException e)
{
//take any relevant handling measures
//rethrow the exception
throw;
}
当然,这在技术上意味着该较低级别的此Try / Catch块的异常未处理,但这是您要获得更高级别的任何东西的唯一方式水平。
有关重新抛出异常的更多信息,请参阅:
答案 1 :(得分:2)
您可以重新抛出相同的异常并在调用模块/日志记录模块中捕获它,然后将其记录下来。 例如:
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 ..
}
}
答案 2 :(得分:0)
不,没有全局异常事件。这将是非常危险的,您将从其他模块中捕获各种内部异常,这些异常不适合公共使用。它也可能会淹没您的日志,但有例外。
您应该更加有条理地了解异常处理以达到相同的效果。封装异常的实际处理,并在实际的catch块中执行最少的工作。要么通过一个“HandleException”方法,你也可以传递每个异常。您可能还要查看企业库中的Exception Handling block。