【问题标题】:How to catch an unhandled exception in Windows Azure (Worker) Role如何在 Windows Azure(工作者)角色中捕获未处理的异常
【发布时间】:2013-05-13 17:47:38
【问题描述】:

我试图在我的工作角色中捕获所有未处理的异常。我尝试将try-catch 块放入Run() 方法(如建议的here)但没有成功。

public override void Run()
{
  try
  {
    base.Run();
  }
  catch (Exception ex)
  {
    Trace.TraceError("Unhandled Exception: {0}", ex);    
    throw ex;
  }
}

该角色承载 WCF 服务,因此Run() 方法内没有其他逻辑。是否有另一种可能在此级别捕获异常?

更新 1 澄清问题:角色自己托管 WCF 服务(在 OnStart() 中初始化),其中一些操作是后台操作。当调用服务并且该方法抛出意外异常时,我喜欢捕获它并将其写入日志。

解决方案: 显然它就像在普通的 C# 应用程序中一样: 只需像这样向UnhandledException 事件添加一个处理程序

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

在角色的OnStart() 内。我太专注于 Azure,以至于我认为这毕竟行不通,我什至没有尝试过 :-)

【问题讨论】:

  • 试试这个简单地抛出new Exception("Testing");的虚拟工作者角色
  • 该角色承载一个 WCF 服务,因此 Run() 方法中实际上没有任何内容。应该提到这一点。
  • @gumo:然后问问你自己,为什么你试图捕捉的异常是不可捕捉的,而只是简单的Exception(以及任何从Exception派生的类)是不可捕捉的?我会给你几分钟时间自己回答。
  • @John:感谢您的帮助,但这不是重点。
  • @John:可能是任何异常,例如角色中的后台操作抛出的 IOException。我认为它不能在 Run() 中被捕获,因为它没有在那里被调用。这是否回答你的问题?再次感谢。

标签: c# exception-handling azure


【解决方案1】:

正如我的问题中已经更新的那样,为了完整起见,这里作为答案:

显然它就像在一个普通的 c# 应用程序中一样:只需像这样向UnhandledException 事件添加一个处理程序

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

在角色的OnStart() 内。

【讨论】:

    【解决方案2】:

    catch 会捕获所有异常。

    你又把它扔了,这样就不会被抓住了。

    您也在记录日志,但在 Azure 中默认情况下不会打开日志,因为它们需要花费。

    另一种选择是没有例外。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-10
      • 2011-10-27
      • 1970-01-01
      • 2017-11-25
      相关资源
      最近更新 更多