C# ASP.NET如何处理未处理的异常?

C# ASP.NET如何处理未处理的异常?,c#,asp.net,exception,exception-handling,visual-studio-debugging,C#,Asp.net,Exception,Exception Handling,Visual Studio Debugging,在为ASP.NET编写时,以及在附加调试器时,如果访问引发异常的网页,则会在导致异常的代码行启动未处理的异常帮助程序 即使您只捕获未处理的异常而不捕获抛出的异常,也会发生这种情况。但是,点击F5、忽略异常或未连接调试器不会导致AppDomain被拆除。相反,ASP.NET无论如何都会处理未处理的异常 这是如何工作的?像这样的异常处理可以在其他地方实现吗?这样其他未处理的异常就可以被吞没,而不是杀死整个AppDomain或进程 编辑:为了澄清,我理解异常处理和try…catch块是如何工作的。但是

在为ASP.NET编写时,以及在附加调试器时,如果访问引发异常的网页,则会在导致异常的代码行启动未处理的异常帮助程序

即使您只捕获未处理的异常而不捕获抛出的异常,也会发生这种情况。但是,点击F5、忽略异常或未连接调试器不会导致AppDomain被拆除。相反,ASP.NET无论如何都会处理未处理的异常

这是如何工作的?像这样的异常处理可以在其他地方实现吗?这样其他未处理的异常就可以被吞没,而不是杀死整个AppDomain或进程

编辑:为了澄清,我理解异常处理和try…catch块是如何工作的。但是,在这种情况下,调试器似乎正在考虑未处理的异常而ASP.NET正在将异常包装为try…catch。这就是我想要模仿的行为

这是怎么回事

只需将正在执行的代码包装到他们想要的任何异常处理代码中。asp.net网页(或视图或控制器)只是一个类,如何使用它完全取决于主机(在我们的例子中是asp.net)

如果它被处理了,为什么VS调试器会破坏它

这里有一段引用自:

ASP.NET有一个顶级异常处理程序,用于处理异常以向浏览器用户显示错误页面。该顶级异常处理程序将阻止未经处理的异常进入调试器,除非仅打开“我的代码”。请确保仅为ASP.NET调试启用“我的代码”

这意味着,如果在VS Debug选项中启用了“仅我的代码”(默认情况下是启用的),您将在自己的代码中未处理的异常中中断,而不管它们是否在调用方中处理

这样的异常处理是否可以在其他地方实现,以便吞没其他未处理的异常,而不是杀死整个AppDomain或进程


你不能这样做,这是一种安全措施。

你的网页只是一堆来自IIS的方法调用&ASP.NET运行时,你的网页在appdomain中不是单独运行的。调用代码的代码在该方法调用周围有一个普通的try/catch块

您可以自己创建类似的设置:

  • 对于控制台应用程序,在Main中的所有内容周围放置一个try/catch块,这意味着您将捕获应用程序中其他地方未处理的任何异常
  • 对于Windows窗体应用程序,通过处理(允许您挂接到Windows窗体消息循环的try/catch块)
  • 对于WPF应用程序,通过处理(允许您挂接到WPF消息循环的try/catch块)
  • 。。。或者你可以使用
这类程序的问题是:你应该在应用程序中的什么位置继续


最后一个问题在ASP.NET中很容易解决,因为每个页面调用都是相互隔离的。用户只需再次导航到某个页面即可继续操作。

我认为可以通过刷新最上面的异常的描述详细信息并将stacktrace添加到HttpResponse来处理该异常。我相信你也可以这样做。这里的关键似乎是用户未处理vs未处理。而否决票是因为。。。?如果这是一个如此简单的问题,为什么没有人能够解释调试器如何从“系统代码”中确定“您的代码?”这是一个好问题。我正在投票升级分数。这并没有回答根本问题——如果整个事情都被包装在一个try/catch块中,为什么它被认为是未经处理的,而不仅仅是由调试器抛出的?因为它不是在用户代码中处理的。VS调试器不知道它是否在IIS模块的深处处理。@SergRogovtsev当然知道。这就是异常处理的本质。请给出任何其他示例,说明用户代码不处理异常,但调用方处理异常,但仍会弹出未处理的异常处理程序。@DavidPfeffer:问得好。。。从这个意义上讲,框架代码与您的代码没有什么不同。调试器是否知道什么是标准框架类,或者是否存在属性?@ArjanEinbu您的代码(即“当前解决方案中从源代码编译的代码”)和所有其他代码(您作为程序集引用的代码)之间存在着无法解释的差异。这就是调试器中的“仅我的代码”选项所知道的。所以您的问题是“为什么VS调试器认为这是一个未处理的异常”?因为它不是在用户代码中处理的。我会在帖子中添加详细的引用和链接。这是有道理的,但实际上似乎不起作用。例如,我使用MassTransit消息总线库,当消息处理程序(我的代码)出现故障时,MassTransit(“系统”代码)处理它,用NLog记录它,然后愉快地继续。用户未处理的异常帮助程序从未弹出。这意味着VS调试器没有将MassTransit识别为“不是您的代码”。坦白说,我不知道。从我们在调试第三方代码时看到的情况来看,它在某种程度上依赖于PDB和其他一些知识。无论如何,它只是调试器内部的一种过滤,而不是将未处理的异常转换为已处理的异常,或者将未处理的异常转换为已处理的异常。