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 中常见的事件和事件监听器 | 低级事件 | 组件事件 | 窗口事件 | 鼠标事件 | 高级事件 | 动作事件 | 事件监听器 )