AppDomain.CurrentDomain.UnhandledException does not get call

本文关键字:get call not does CurrentDomain UnhandledException AppDomain | 更新日期: 2023-09-27 18:12:06

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

我们的想法是至少记录所有的异常。

但是它似乎从来没有被调用过。我尝试在我的一个服务操作中进行除零操作,它只是在遇到异常后停止服务。

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

永远不会调用LogUnhandledException方法。

我在IIS和调试器中都试过了。

如何使此事件为WCF服务工作?

AppDomain.CurrentDomain.UnhandledException does not get call

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

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

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

如果你想记录由WCF服务抛出的异常,那么看看IErrorHandler接口。

尝试捕获一个ThreadException,例如

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

我有同样的问题在WinForms应用程序前一段时间。UnhandledException将为真正未处理的异常引发,这些异常通常会立即终止整个进程。通常有一个全局处理程序不会让这种情况发生,并提供一些默认行为。所以你需要在异常进入处理程序之前捕获它。这可以通过ThreadException来实现。

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

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

我想知道你的电话和这个有"+= new"的电话有什么不同……但值得一试。