【问题标题】:AppDomain.CurrentDomain.UnhandledException does not get calledAppDomain.CurrentDomain.UnhandledException 没有被调用
【发布时间】:2013-04-27 06:14:33
【问题描述】:

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

【问题讨论】:

  • 我想知道这是否与 IIS 或 WCF 服务的托管方式有关。就像here,这些家伙说:总之,可以使用 global.asax 中的 Application_Error 事件处理程序来捕获 ASP.NET 应用程序中未处理的异常,或者通过创建 HttpModule 来捕获 AppDomain.UnhandledException 事件。

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


【解决方案1】:

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

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

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

如果您想记录 WCF 服务引发的异常,请查看 IErrorHandler interface。

【讨论】:

    【解决方案2】:

    尝试同时捕获 ThreadException,例如

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 没有区别。一种只是“老派”C# 表示法。它们编译相同。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-15
      • 1970-01-01
      • 1970-01-01
      • 2018-11-25
      • 2019-03-31
      • 2012-12-16
      • 2015-03-28
      相关资源
      最近更新 更多