1

在为ASP.NET编写代码时,如果连接了调试器,如果您访问引发异常的网页,则会在导致该异常的代码行中启动未处理的异常帮助程序。ASP.NET如何处理未处理的异常?

即使您只捕获未处理的异常并且没有捕获抛出的异常,也会发生这种情况。但是,按F5,忽略异常,或者没有附加调试器不会导致AppDomain被拆除。不管怎样,ASP.NET无论如何处理未处理的异常。

这是如何工作的,并且像这样的异常处理可以在其他地方实现,以便吞并其他未处理的异常而不是终止整个AppDomain或进程?

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

+0

我认为这个异常是通过将最上面的异常的描述细节和stacktrace刷新到HttpResponse来处理的。我相信你也可以这样做。 – TWickz 2012-07-28 11:31:11

+0

这里的关键似乎是**用户** - 未处理vs未处理。 – 2012-07-28 15:47:07

+0

而反对票是因为...?如果这是一个简单的问题,为什么没有人能够解释调试器如何从“系统代码”中确定“你的代码”? – 2012-07-30 12:12:24

回答

2

这是如何工作的,

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

为什么VS调试器如果处理它会中断?

有一个引自MSDN documentation

ASP.NET有处理异常显示错误页面,浏览器用户的顶级异常处理程序。除非启用了“我的代码”,否则该顶级异常处理程序将停止未处理的异常进入调试器。确保启用Just My Code for ASP.NET调试。

这意味着如果你有“仅我的代码”,在VS调试选项启用(和它的默认启用),你会在例外情况,在自己的代码是未处理的,他们在是否处理irregardless突破您的来电者与否。

像这样的异常处理可以在其他地方实现,这样其他未处理的异常可以被吞噬而不是终止整个AppDomain或进程?

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

+0

所以你的问题是“为什么VS调试器认为这是一个未处理的异常”?因为它不是在用户代码中处理的。我会添加详细的报价和链接到帖子。 – 2012-07-28 12:07:22

+0

这是有道理的,但在实践中似乎并不奏效。例如,我使用MassTransit消息总线库,当消息处理程序(我的代码)失败时,MassTransit(“系统”代码)处理它,使用NLog记录它,然后快乐地前进。用户未处理的异常帮助程序永远不会弹出。 – 2012-07-28 12:17:46

+0

这意味着VS调试器不会将MassTransit识别为“不是您的代码”。 – 2012-07-28 12:48:23

1

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

您可以创建一个类似的设置自己:通过将围绕主营eveything一个try/catch块,这意味着you'l赶上未在其他地方处理的任何异常

问题则是:在应用程序应该在哪里你继续?

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

+0

这并没有回答基本的问题 - 如果整个事情被包装在try/catch块中,为什么它被认为是未处理的,而不仅仅是调试器抛出? – 2012-07-28 12:02:04

+0

因为它没有在用户代码*中处理。 VS调试器不知道它是否在IIS模块内部深处处理。 – 2012-07-28 12:03:13

+0

@SergRogovtsev当然是的。这是异常处理的本质。向我展示其他用户代码不处理异常但调用者会这样做的其他示例,但仍会弹出一个未处理的异常处理程序。 – 2012-07-28 12:05:39