我有一个ASP.Net网站,它有自定义内部线程,用于定期发生的任务。
如果我在其中一个线程上遇到异常,则不会在Global.ASAX的Application_Error()函数中捕获它。它可以冒泡到IIS,我通过查看事件查看器日志找到它。如果我发现异常,那么Log4Net将向我发送一封电子邮件,我应该相对快速地找到错误。
有没有办法可以在这些线程上捕获异常?该应用程序需要“永远在线”,因此放弃应用程序的例外是一个显示阻止。
答案 0 :(得分:0)
在你提到的评论中:
这是一个网站,而不是网络应用。
"网站"与#34;网络应用"在这一点上似乎是一个没有实际意义的区别。代码的复杂性足以使它成为一个应用程序"几乎任何这个词的定义。到那时,如果应用程序主机没有为您有意义地管理线程故障(我不希望Web应用程序主机这样做),那么您必须手动管理它们。
在这种情况下,我认为这是两个选项之一:
选项1:不要让您的线程以故障状态结束。无论您的任何给定线程的顶级工作项是什么(在线程开始时调用的方法,循环重复操作等),都需要基本上是防错的。没有例外可以超越它。这意味着它需要简单化(以便不抛出它自己的异常)并且需要捕获它调用的操作中的任何和所有异常。
一旦被抓住,请随意使用它们。回滚一个工作单元,通知某人错误等等。
选项2:将长时间运行的线程操作移出Web应用程序,因为Web应用程序并不适合正在进行的后台进程。 Windows服务或计划的控制台应用程序是更适合该逻辑的应用程序主机。
是吗?它不应该。这实际上是代码最初是如何构建的,与应用程序主机本身无关。从一个应用程序主机调用业务操作与从另一个应用程序主机调用它相同。如果逻辑与应用技术紧密耦合,那就是一个单独的问题。并没有快速解决这个问题。好消息是,一旦你修复那个问题,其他问题(比如提示这个问题的那个)就是快速修复。是的,虽然有点重写。