7

我有一个 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 服务?

4

3 回答 3

9

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

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

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

如果要记录 WCF 服务引发的异常,请查看IErrorHandler界面

于 2013-05-02T22:39:00.510 回答
2

尝试也捕获一个 ThreadException,例如

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

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

于 2013-05-03T02:11:57.713 回答
0

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

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

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

于 2013-05-02T22:36:37.960 回答