不会调用AppDomain.CurrentDomain.UnhandledException

时间:2013-05-02 22:29:23

标签: c# asp.net .net wcf iis

我有一个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);
}

我们的想法是至少记录所有未公开的例外情况。

但它似乎从来没有被召唤过。我尝试在我的一个服务操作中执行Divide by Zero,它只是在遇到异常后停止服务。

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

永远不会调用LogUnhandledException方法。

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

如何让此活动适用于WCF服务?

3 个答案:

答案 0 :(得分:8)

unhandled exception filter for an app domain是允许应用程序在终止之前记录有意义信息的最后尝试。

  

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

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

如果要记录WCF服务引发的异常,请改为查看IErrorHandler interface

答案 1 :(得分:2)

尝试捕获ThreadException,例如

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

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

答案 2 :(得分:0)

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

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

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