AppDomain.AssemblyLoad 事件捕获事件处理程序中引发的所有异常

Posted

技术标签:

【中文标题】AppDomain.AssemblyLoad 事件捕获事件处理程序中引发的所有异常【英文标题】:AppDomain.AssemblyLoad event catches all exceptions raised within the event handlers 【发布时间】:2012-09-21 10:45:24 【问题描述】:

.NET AppDomain.AssemblyLoad 事件似乎捕获了它的事件处理程序中抛出的任何异常,而不是将它们传播给触发程序集加载的调用者(例如 Assembly.LoadFile())。

我的第一个问题是为什么会存在这种捕获所有异常的行为? Microsoft 通常非常严格地确保异常始终在其 BCL 中传播。

我的第二个问题,有没有办法关闭这种行为?

背景:我需要在加载程序集时对其进行扫描,并确保它们符合某些约定。如果不这样做,则应引发异常(并被可能触发程序集负载的多种机制捕获)。

注意:我已经找到了这个问题'Throw exception from AppDomain.AssemblyLoad event',不是重复的。我的问题逻辑上是从该问题的结论得出的。

【问题讨论】:

【参考方案1】:

不,异常被 CLR 吞没了,没有办法改变这种行为。大多数 AppDomain 事件都是这种情况:AssemblyLoad、DomainUnload 和 ProcessExit。 SSCLI20 源代码没有指示这样做的原因的 cmets。

粗略的猜测是代码埋在 CLR 堆栈帧内太深,无法进行合理的诊断和展开帧,并且恢复状态太困难。 AssemblyLoad 因为几乎总是在抖动忙于生成代码时引发该事件,DomainUnload 和 ProcessExit 因为 CLR 忙于关闭所有代码执行。

解决方法很明确,如果您必须捕获异常,那么您需要在事件处理程序中使用 try/catch 语句。

【讨论】:

以上是关于AppDomain.AssemblyLoad 事件捕获事件处理程序中引发的所有异常的主要内容,如果未能解决你的问题,请参考以下文章

Java AWT 图形界面编程事件处理机制 ③ ( AWT 中常见的事件和事件监听器 | 低级事件 | 组件事件 | 窗口事件 | 鼠标事件 | 高级事件 | 动作事件 | 事件监听器 )

WPF的路由事件冒泡事件隧道事件(预览事件)

阻止默认事件,滚轮事件与滚动事件

事件驱动机制是啥?

HTML 事件 事件流与事件委托

事件驱动架构