C# 捕获函数参数中的异常
我正在测试.NET应用程序中的异常处理。使用下面的代码,我可以记录所有异常,但我不知道如何捕获它们,所以它们不会停止我的应用程序。 以下是我正在使用的代码:C# 捕获函数参数中的异常,c#,.net,exception,C#,.net,Exception,我正在测试.NET应用程序中的异常处理。使用下面的代码,我可以记录所有异常,但我不知道如何捕获它们,所以它们不会停止我的应用程序。 以下是我正在使用的代码: public class ExceptionHandler { public ExceptionHandler() { AppDomain currentDomain = AppDomain.CurrentDomain; currentDomain.FirstChanceException
public class ExceptionHandler
{
public ExceptionHandler()
{
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.FirstChanceException += MyHandler2;
}
private void MyHandler2(object sender, FirstChanceExceptionEventArgs e)
{
try
{
throw e.Exception;
//this ends up in eternal loop with 'stack overflow'
}
catch (Exception exception)
{
//exception never comes here, but if the exception is
//not caught inside catch block, then it's unhandled and it stops application
}
}
}
那么,如何在MyHandler2中捕获异常e?我不能只使用catch,它必须是try-catch 您无法以尝试的方式抑制异常;这只是一个做日志之类事情的机会;: 此事件只是一个通知。处理此事件不会处理异常或以任何方式影响后续异常处理
您无法以您尝试的方式抑制异常;这只是一个做日志之类事情的机会;: 此事件只是一个通知。处理此事件不会处理异常或以任何方式影响后续异常处理
当然,这还没有涉及到catch条款。无意中,您创建了一个递归: 第一次机会异常发生在您的程序中的某个位置。 正在触发您的处理程序。 在你的处理程序中有一个第一次机会的异常,woops!最好转到我的异常处理程序! 正在触发您的处理程序。 在你的处理程序中有一个第一次机会的异常,woops!最好转到我的异常处理程序! 正在触发您的处理程序。 在你的处理程序中有一个第一次机会的异常,woops!最好转到我的异常处理程序! 正在触发您的处理程序。 在你的处理程序中有一个第一次机会的异常,woops!最好转到我的异常处理程序! ... 还有你的堆栈溢出 正如@Marc Gravell在他的回答中指出的,这个事件不是为了处理异常。例外情况应在本地处理。
查看更多详细信息。当然,这不是catch子句。无意中,您创建了一个递归: 第一次机会异常发生在您的程序中的某个位置。 正在触发您的处理程序。 在你的处理程序中有一个第一次机会的异常,woops!最好转到我的异常处理程序! 正在触发您的处理程序。 在你的处理程序中有一个第一次机会的异常,woops!最好转到我的异常处理程序! 正在触发您的处理程序。 在你的处理程序中有一个第一次机会的异常,woops!最好转到我的异常处理程序! 正在触发您的处理程序。 在你的处理程序中有一个第一次机会的异常,woops!最好转到我的异常处理程序! ... 还有你的堆栈溢出 正如@Marc Gravell在他的回答中指出的,这个事件不是为了处理异常。例外情况应在本地处理。
查看更多详细信息。为什么要再次抛出异常?只需在MyHandler2中处理e.Exception。 FirstChanceException处理程序将在CLR之前处理它,因此它将永远不会到达MyHandler2中的Catch块,并将再次调用MyHandler2,因此它将成为递归的,并最终进入StackOverflow 正如马克所解释的: 此事件只是一个通知。处理此事件不会处理异常或以任何方式影响后续异常处理 以下是获得通知的唯一方法:
private void MyHandler2(object sender, FirstChanceExceptionEventArgs e)
{
//Never throw here
//throw e.Exception;
GetNotified(e.Exception);
}
这里的GetNotified是一种方法,您可以记录错误或发送通知,但抛出错误除外。为什么要再次抛出异常?只需在MyHandler2中处理e.Exception。 FirstChanceException处理程序将在CLR之前处理它,因此它将永远不会到达MyHandler2中的Catch块,并将再次调用MyHandler2,因此它将成为递归的,并最终进入StackOverflow 正如马克所解释的: 此事件只是一个通知。处理此事件不会处理异常或以任何方式影响后续异常处理 以下是获得通知的唯一方法:
private void MyHandler2(object sender, FirstChanceExceptionEventArgs e)
{
//Never throw here
//throw e.Exception;
GetNotified(e.Exception);
}
GetNotified是一种方法,您可以在其中记录错误或发送通知,但抛出错误除外。VB.NET标记与此无关,是吗?您只想在其中包含日志逻辑。当处理程序退出时,其他一切都将正常进行,异常将像没有处理程序时一样正常运行。@Tim-为什么不呢?我可以在VB.NET中做同样的事情。鲍德里克-我想抓住这个例外。所以这是不可能的?未处理异常的问题是在何处恢复执行。想想看——一个异常会展开堆栈,直到它碰到一个catch块或一直返回到顶部。如果您还没有处理好它,那么您希望您的程序在哪里恢复?接下来应该执行哪行代码?这就是为什么需要处理异常。这是无法回避的。你不能杀死一个未处理的异常。只捕获它,以便您可以出于调试目的记录它,或者在应用程序/服务爆炸之前整理一些打开的资源。如果您遇到未处理的异常;你正在应用程序中的某个地方使用快捷方式,应该更有效
停止/处理这些异常的源。VB.NET标记不相关,是吗?您只想在其中包含日志逻辑。当处理程序退出时,其他一切都将正常进行,异常将像没有处理程序时一样正常运行。@Tim-为什么不呢?我可以在VB.NET中做同样的事情。鲍德里克-我想抓住这个例外。所以这是不可能的?未处理异常的问题是在何处恢复执行。想想看——一个异常会展开堆栈,直到它碰到一个catch块或一直返回到顶部。如果您还没有处理好它,那么您希望您的程序在哪里恢复?接下来应该执行哪行代码?这就是为什么需要处理异常。这是无法回避的。你不能杀死一个未处理的异常。只捕获它,以便您可以出于调试目的记录它,或者在应用程序/服务爆炸之前整理一些打开的资源。如果您遇到未处理的异常;您正在应用程序中的某个位置使用快捷方式,应该更有效地停止/处理这些异常的来源。现在我了解了它是如何发生的。现在我了解了它是如何发生的。您可以为handle提供命名空间吗?我找不到它。你说的句柄是什么意思?起初你的代码是:Handlee.Exception->编辑后是GetNotifiede.Exception。现在我明白了,或者至少我猜是这样,使用“Handle”表示的是日志记录或其他操作,而不是捕获异常。@user867703是的,我更改了方法名称,因此应该清楚该方法不会进一步引发异常,而只是写入日志或得到通知。您可以为Handle提供名称空间吗?我找不到它。你说的句柄是什么意思?起初你的代码是:Handlee.Exception->编辑后是GetNotifiede.Exception。现在我明白了,或者至少我猜是这样,使用“Handle”表示的是日志记录或其他操作,而不是捕获异常。@user867703是的,我更改了方法名称,因此应该清楚该方法不会进一步引发异常,而只是写入日志或得到通知。