我有一个MVC + SignalR应用程序,它有大量的Reactive Extensions订阅,所有这些都是来自Socket实时数据的投影。其中一些订阅没有按预期工作,当它们引发异常时,它只是进入虚空,除非我正在调试。
我曾希望我可以使用Elmah自动记录这些未处理的异常,但似乎除非异常发生在处理请求/响应的同一个线程上,例如它会导致黄色的死亡屏幕,艾玛没有接触它。所以我的问题有两个:
我可以让Elmah自动记录后台/工作进程的异常吗?
如果对#1的回答是“否”,除了将我的订阅包装在非常高的级别的try / catch块中之外,我的下一个最佳选择是什么?
答案 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);