C# try/catch在未处理的异常处理程序中不工作

C# try/catch在未处理的异常处理程序中不工作,c#,exception-handling,unhandled-exception,C#,Exception Handling,Unhandled Exception,我在一个应用程序中遇到了一个奇怪的症状,未处理异常的处理程序中的try/catch不起作用:即catch中的断点不会被命中,即使try中的断点被命中 显然,在UnhandledException中搜索“未处理的异常”对我来说不是很好 我试过做一个小型的概念验证,但不幸的是,它确实有效 所以,当我试图找出问题的根源时,如果这里有人有任何想法,我会非常感激 我们最近从XP改成了Windows7,从4.0改成了.NET4.5——我很确定以前这是可行的 编辑:看起来它是由调用一个托管C++库引发的,它正

我在一个应用程序中遇到了一个奇怪的症状,未处理异常的处理程序中的try/catch不起作用:即catch中的断点不会被命中,即使try中的断点被命中

显然,在UnhandledException中搜索“未处理的异常”对我来说不是很好

我试过做一个小型的概念验证,但不幸的是,它确实有效

所以,当我试图找出问题的根源时,如果这里有人有任何想法,我会非常感激

我们最近从XP改成了Windows7,从4.0改成了.NET4.5——我很确定以前这是可行的

<>编辑:看起来它是由调用一个托管C++库引发的,它正在抛出Sytal.Access违规事件。奇怪的是,如果我用throw new AccessViolationException替换调用,它会执行我想要的操作…

尝试以下操作:
我认为我们无法处理未处理的异常,最终必须退出应用程序。 试试这个:
我认为我们无法处理未处理的异常,最终必须退出应用程序。

请确保尝试捕获System.AccessViolationException而不是本机访问冲突错误

当您抛出新的AccessViolationException时,它抛出System.AccAccessViolationException。
如果您调用的库是本机库,它可能会抛出本机访问冲突错误,但.NET catch块通常只能捕获托管异常。

请确保尝试捕获System.AccessViolationException而不是本机访问冲突错误

当您抛出新的AccessViolationException时,它抛出System.AccAccessViolationException。
若您调用的库是本机库,它可能会抛出本机访问冲突错误,但.NET catch块通常只能捕获托管异常。

您写道,我们最近更改了。Net 4.5从4.0版开始—我非常肯定以前的做法是有效的。但以下内容似乎值得补充,因为“相当确定”实际上意味着“不确定”:-

我在某个地方读到,AccessViolationException不能发生在托管代码中,但可能会被非托管代码的运行时捕获。也许C++库调用非托管代码?< /p>
在.NET 4+中,进程将在AccessViolationException之后终止。您的异常处理程序将被忽略。这是一组被视为不可恢复的异常类型之一:。在.NET 4+中,您需要自定义应用程序配置以覆盖此行为。

您写道,我们最近更改了。Net 4.5从4.0版开始—我非常肯定以前的做法是有效的。但以下内容似乎值得补充,因为“相当确定”实际上意味着“不确定”:-

我在某个地方读到,AccessViolationException不能发生在托管代码中,但可能会被非托管代码的运行时捕获。也许C++库调用非托管代码?< /p>
在.NET 4+中,进程将在AccessViolationException之后终止。您的异常处理程序将被忽略。这是一组被视为不可恢复的异常类型之一:。在.NET 4+中,您需要自定义应用程序配置以覆盖此行为。

尝试在一个AggregateException中推送异常并重新推送它-这在.NET中是常见的做法。我认为我们无法处理未处理的异常,必须最终在中退出应用程序。因此,您在未处理的异常中做了一些工作,而未处理的异常又会引发异常您希望捕获的异常?您的工作概念验证应用程序是否包括抛出新的AccessViolationException,或者它是否做了一些事情来导致这种类型的真正异常?如果此异常是伪造的,我不会相信“工作”行为-请参阅我的答案。尝试在一个AggregateException中推送异常并重新推送它-这在中是常见的做法。NETi认为我们无法处理未处理的异常,必须最终退出应用程序。因此,您正在未处理的异常中进行一些工作,而这反过来又是错误的正在引发您想要捕获的异常?您正在运行的概念验证应用程序是否包含throw new AccessViolationException,或者它是否会导致此类真正的异常?如果这个例外是伪造的,我不会相信“工作”行为——看我的答案。好主意,在这种情况下似乎不是这样。好主意,在这种情况下似乎不是那样。绿色锋利的东西是你的,先生。在这两方面你都是对的:“修复”了这一点,抛出AccessViolationException显然没有做任何类似的事情。非常感谢。根据另一种选择,是在处理程序上添加[HandleProcessCorruptedStateExceptions]属性。@Benjol-我在哪里读到了进一步的内容。。。在我上面的回答中,我指出,从Windows接收到的访问冲突将被标记为损坏的状态异常CSE,但在用户代码中通过编写throw new System而引发的访问冲突。AccessViolation­exception将不会被标记为CSE。@Benjol-您是否能够使用[HandleProcessCorruptedStateExceptions]successf
真的吗?我这么问是因为一年前我试着这么做的时候没有什么不同。我一定错过了什么,但最终决定不错过,因为a AccessViolationException消失了它是由第三方DLL中的一个错误引起的,该错误已修复,b我们决定应用MSDN文章中的建议:为这个错误设计恢复代码太难了。它似乎起到了作用。我还要求修复底层dll,但在这种情况下,我并不真正关心“恢复”本身,只是优雅地失败,即登录,不显示默认的Windows“phone home”对话框。绿色夏普的东西是你的,先生。在这两方面你都是对的:“修复”了这一点,抛出AccessViolationException显然没有做任何类似的事情。非常感谢。根据另一种选择,是在处理程序上添加[HandleProcessCorruptedStateExceptions]属性。@Benjol-我在哪里读到了进一步的内容。。。在我上面的回答中,我指出,从Windows收到的访问冲突将被标记为损坏的状态异常CSE,但在用户代码中通过编写throw new System而引发的访问冲突。AccessViolation­exception将不会被标记为CSE。@Benjol-您是否能够成功使用[HandleProcessCorruptedStateExceptions]?我这么问是因为一年前我试着这么做的时候没有什么不同。我一定错过了什么,但最终决定不错过,因为a AccessViolationException消失了它是由第三方DLL中的一个错误引起的,该错误已修复,b我们决定应用MSDN文章中的建议:为这个错误设计恢复代码太难了。它似乎起到了作用。我还要求修复底层dll,但在本例中,我并不真正关心“恢复”本身,只是优雅地失败了,即登录,并且没有显示默认的Windows“phone home”对话框