Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 捕获函数参数中的异常_C#_.net_Exception - Fatal编程技术网

C# 捕获函数参数中的异常

C# 捕获函数参数中的异常,c#,.net,exception,C#,.net,Exception,我正在测试.NET应用程序中的异常处理。使用下面的代码,我可以记录所有异常,但我不知道如何捕获它们,所以它们不会停止我的应用程序。 以下是我正在使用的代码: public class ExceptionHandler { public ExceptionHandler() { AppDomain currentDomain = AppDomain.CurrentDomain; currentDomain.FirstChanceException

我正在测试.NET应用程序中的异常处理。使用下面的代码,我可以记录所有异常,但我不知道如何捕获它们,所以它们不会停止我的应用程序。 以下是我正在使用的代码:

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是的,我更改了方法名称,因此应该清楚该方法不会进一步引发异常,而只是写入日志或得到通知。