防止未处理的异常导致Azure工作角色崩溃

6
我们有一个在Azure上运行的工作角色,它承载着大量异步工作负载,其中有许多IO线程的完成等操作。

偶尔会出现在我们不拥有的异步回调中发生未处理的异常。这反过来又导致角色失败。

在非Azure ASP.NET应用程序中,我们可以通过在aspnet.config中启用传统的未处理异常策略来避免这种情况,例如:

<configuration> 
  <runtime> 
    <legacyUnhandledExceptionPolicy enabled="1" /> 
  <runtime>
<configuration>

有没有办法对Azure worker角色做同样的事情?我们试图将其放置在角色项目的app.config中,但这并没有起作用(因为我们可能必须以某种方式将其放入WaWorkerHost.exe.config中)。

我们知道AppDomain.CurrentDomain.UnhandledExceptionApplication.SetUnhandledExceptionMode以及如何在Windows Azure(Worker)角色中捕获未处理的异常,但这些都无法解决我们的问题。


仍在寻找答案!请发表意见。 - ionwarp
1个回答

0

刚刚看了你的帖子,因为我在一个Web角色中也遇到了同样的问题。现在我添加了你的代码片段,并检查是否会再次出现此错误。对AppDomain类进行了一些研究:http://msdn.microsoft.com/en-us/library/system.appdomain.aspx。事实上,我正在寻找未处理异常策略,但没有找到。但我找到了“UnhandledException”事件http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx

但是你写道这不起作用。因为这也会在以后影响我 - 我将在Azure工作角色中运行第三方开源组件 - 我做了一些研究。

我将尝试为第三方代码创建一个新的AppDomain - 如果发生异常,它将崩溃/卸载新创建的AppDomain而不是当前运行代码的AppDomain。另一个解决方案可能是创建一个新进程,这可能更麻烦。

编辑: 我重新访问了这个主题:在2.0版本中,引入了一个功能,在类库中的线程(非主线程)遇到错误时,会拆除应用程序域。似乎即使使用单独的应用程序域也无济于事。据我所知,这种设计应该通过在库级别捕获异常并适当处理它们来帮助调试隐藏在库中的错误。但是令我困惑的是,如果我们使用第三方类库而无法控制呢?那么,如果我们的问题对供应商来说太小而无法及时解决,我们就陷入了困境。


Marc,如果可能的话,我正在寻找更好的答案。希望不需要管理应用程序域(当其被撤销时,我们不想失去应用程序域状态),也不需要创建自己的进程。 - ionwarp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接