【问题标题】:Catching Exceptions in background threads with Elmah使用 Elmah 在后台线程中捕获异常
【发布时间】:2015-01-22 20:36:01
【问题描述】:

我有一个 MVC+SignalR 应用程序,它有很多响应式扩展订阅飞来飞去,所有这些都是来自 Socket 的实时数据投影。其中一些订阅没有按预期工作,当它们引发异常时,除非我正在调试,否则它只会进入无效状态。

我曾希望我可以使用Elmah 自动记录这些未处理的异常,但似乎除非异常发生在处理请求/响应的同一线程上,例如它会导致黄屏死机,否则 Elmah 不是不碰它。所以我的问题是双重的:

  1. 我可以让 Elmah 自动记录后台/工作进程的异常吗?

  2. 如果对 #1 的回答是“否”,那么除了将我的订阅以非常高的级别包装在 try/catch 块中之外,我的下一个最佳选择是什么?

【问题讨论】:

  • 不确定 Rx 是否与此处相关,删除标签 - 如果您有特定于 Rx 的问题,请重新添加
  • @PaulBetts 反应式扩展在这里是相关的,因为在我的情况下,这是在工作进程上运行的。但是,如果一个答案适用于我的情况,它应该适用于任何与标题中所述相同问题的人。

标签: asp.net multithreading elmah


【解决方案1】:

广告 1) 如果它还没有发生,它可能不会发生。

我不知道您究竟是如何使用后台线程的,但我会尝试解释 ELMAH 处理是否有效。 ELMAH 集成到 ASP.NET 管道中,当错误发生时由 ASP.NET 管道处理,显示错误页面(如 http 错误 500)并调用ErrorLogModule。另外引用Using HTTP Modules and Handlers to Create Pluggable ASP.NET Components -> Adding ELMAH to an ASP.NET Web Application

该部分将 ErrorLogModule HTTP 模块添加到 ASP.NET HTTP 管道。确保你包括这个 设置,否则 ELMAH 将不会监听 Error 事件,并且 因此不会记录任何未处理的异常。

广告 2) 因为您使用的是响应式扩展程序,所以您可以处理 onError,您可以在其中自动登录 Elmah。如果您不想在 OnError 中到处编写错误挂起,只需创建您自己的函数或方法扩展,它会自动为您包装它。手动写入 ELMAH 很简单,只需调用:

Elmah.ErrorSignal.FromCurrentContext().Raise(ex);

【讨论】:

  • 在应用程序池的后台线程或工作线程中,当前上下文为空,这会使该方法调用引发异常。我目前正面临这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-10
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
  • 2013-06-05
  • 2011-02-19
相关资源
最近更新 更多