【发布时间】:2017-10-25 21:13:01
【问题描述】:
我一直在研究如何处理应用程序的所有异常,而不会过多地弄乱代码。此处的主要目标是将有关异常的信息发送到外部平台,例如 Application Insights。 到目前为止,我找到了以下方法:
城堡拦截器:
这是迄今为止最好的方法,问题是,对于要拦截的方法,要么方法是虚拟的,要么必须接口类。由于我正在开发一个非常大的应用程序,因此不需要这些更改。事件:
使用 AppDomain UnhandledException 也是要考虑的,但由于我有几个应用程序域需要进行大量更改,因此只为异常处理类,这不是最佳的,因为类不应该仅仅因为异常处理而被弄乱。 除了 AppDomain 的数量之外,我还运行了几个线程,这些处理程序不会捕获异常。PostSharp:
PostSharp 的工作方式与 Castle 类似,如果我理解正确,这里的问题是我必须将属性/装饰器添加到我想要拦截的所有方法中,这也不是一个很好的方法。
如果有人对这里的最佳方法有任何建议,我将不胜感激。
【问题讨论】:
-
您不一定想要处理应用程序的所有异常。一些例外是好的......它们会告诉你你的程序什么时候做它不应该做的事情。
-
@Abion47:捕获所有异常是好的。有时您想再次丢弃它们而不是恢复程序流程,但捕获它们以便您至少可以正确记录它们是好的。
-
这里的重点是将异常信息发送到Application Insights,不一定要吃异常,我可以重新抛出它。就像@Chris 提到的那样:)
-
我的这个任务可能会有所帮助stackoverflow.com/q/30326673/495455
-
如果更改足够简单(例如在每个捕获中调用静态方法),也许您可以使用 Mono.Cecil github.com/jbevain/cecil 修改您的程序集.. 甚至使用它来添加所需的属性由 PostSharp .. 不确定是否是一个可行的解决方案,只是一个想法
标签: c# events exception-handling castle-windsor