AppDomain.CurrentDomain.UnhandledException未被调用

我有一个WCF服务,在Global.asax中有以下代码:

protected void Application_Start(object sender, EventArgs e) { // Make sure that any exceptions that we don't handle at least get logged. AppDomain.CurrentDomain.UnhandledException += LogUnhandledException; } private void LogUnhandledException(object sender, UnhandledExceptionEventArgs e) { Log.Error.LogException("UnhandledException", e.ExceptionObject as Exception); } 

我们的想法是至少记录所有未公开的exception。

但它似乎从未被称为。 我尝试在我的一个服务操作中执行Divide by Zero,它只是在遇到exception后停止服务。

 int zero = 0; int result = 100 / zero; 

永远不会调用LogUnhandledException方法。

我在IIS中运行并在调试器中运行。

如何让此事件适用于WCF服务?

应用程序域的未处理exceptionfilter是允许应用程序在终止之前记录有意义信息的最后尝试。

此事件提供未捕获exception的通知。 它允许应用程序在系统默认处理程序向用户报告exception并终止应用程序之前记录有关exception的信息。

如果WCF允许服务抛出的exception以这种方式完全未处理,则意味着当服务在IIS中托管时,整个工作进程将被终止,因为单个请求引发了exception – 不是理想的结果。 因此,WCF不会保留未处理的服务抛出的exception – 在这种情况下不会引发此事件

如果要记录WCF服务抛出的exception,请查看IErrorHandler接口 。

尝试捕获ThreadException,例如

  Application.ThreadException += Application_ThreadException; AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; 

我刚才在WinForms应用程序中遇到了同样的问题。 针对真正未处理的exception引发UnhandledException ,这些exception通常会立即终止整个进程。 通常,有一个全局处理程序不会发生这种情况,并提供一些默认行为。 因此,您需要在它转到该处理程序之前捕获exception。 这可以通过ThreadException完成。

你试过这个吗?
来自http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx

 AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(LogUnhandledException); 

我想知道你的电话和这个电话有什么区别,“+ =新”…但是值得一试。