使用Elmah捕获后台线程中的异常

时间:2014-11-25 00:11:33

标签: asp.net multithreading elmah

我有一个MVC + SignalR应用程序,它有大量的Reactive Extensions订阅,所有这些都是来自Socket实时数据的投影。其中一些订阅没有按预期工作,当它们引发异常时,它只是进入虚空,除非我正在调试。

我曾希望我可以使用Elmah自动记录这些未处理的异常,但似乎除非异常发生在处理请求/响应的同一个线程上,例如它会导致黄色的死亡屏幕,艾玛没有接触它。所以我的问题有两个:

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

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

1 个答案:

答案 0 :(得分: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不会收听错误事件,并且   因此,不会记录任何未处理的异常。

广告2)由于您使用的是Reactive Extensions,因此您可以处理onError,您可以在其中自动登录Elmah。如果你不想在任何地方写入OnError中的错误挂起,只需创建自己的函数或方法扩展,它将自动包装它。手动写入ELMAH只需调用:

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