【问题标题】:Can I Add a handler to AppDomain.CurrentDomain.UnhandledException in a class library我可以在类库中向 AppDomain.CurrentDomain.UnhandledException 添加处理程序吗
【发布时间】:2026-01-01 06:50:02
【问题描述】:

我想订阅 AppDomain.CurrentDomain.UnhandledException 事件以捕获任何错误,因为我正在尝试一种新的设计模式,我不想在每个事件上都尝试捕获。

通常在 win forms 应用程序中有一个主入口点,但这是一个由另一个应用程序调用的类库。

类库中是否有一个主入口点,我可以在其中连接此事件,或者在类库中是不可能的,除非我确定一个方法会在其他任何事情之前被调用?

【问题讨论】:

  • @Jodrell - 谢谢,但我可以使用 [STAThread] 属性在我的程序集中定义一个位置,该位置将自动被调用。这不是一个可执行文件,调用应用程序可以以任何顺序实例化任何形式。这就是为什么我需要在任何事情发生之前订阅这个事件
  • 类似于 .Net 应用程序的挂钩
  • 你可以按照这些思路做些事情codingthewheel.com/archives/…
  • @Jodrell,读起来很有趣。虽然我在做什么有点矫枉过正:) 无论如何谢谢

标签: c# class-library unhandled-exception


【解决方案1】:

不,类库没有主入口点。如果您觉得自己需要一个,那么您可以在概念上通过您的公共 API 表面积虚拟创建一个。换句话说,限制哪些对象是公共的,并且在这些公共对象中确保调用在某个时候进行。在做任何事情之前,这可能需要某种工厂调用来设置您的库。

【讨论】:

  • 谢谢,我就是这么想的。我希望在加载程序集本身时可以挂钩某种事件。不幸的是,我无法从调用应用程序中获取任何内容。看起来这将不得不等到我的下一个可执行文件
【解决方案2】:
// Set the unhandled exception mode to force errors to go through our handler. 
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

// Add the event handler for handling thread exceptions to the event.
AppDomain.CurrentDomain.UnhandledException += 
    new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

感谢Brian Dishaw

显然,这并没有给你一些分配处理程序的非声明性方式,在 app.config 中分配一个跟踪侦听器,但是,这给了我一个想法。

您可以编写自己的配置部分来执行此代码。然后在加载配置时,您可以分配事件处理程序,我会找到一些有关如何执行此操作的链接...

但是,您的配置必须存在于主应用程序中,所以这可能不正确。

编辑 抱歉,如果没有某种 IoC 框架,我认为没有办法做到这一点,还有什么可以加载你的类。我能想到的唯一选项都需要对主应用程序进行某种更改。

我有兴趣犯错。

【讨论】:

  • 谢谢 - 我已经知道未处理的异常事件(它在问题的标题中)。我的问题是类库中是否有一个入口点,我可以在调用其他任何东西之前将其连接起来。
  • 我明白你的意思了,我已经添加了一些额外的内容,更多内容即将发布
  • 我失败了,想不出任何符合简报的东西。
  • @Jodril - 没问题,感谢您的意见。我不认为这是可能的,我只是想我会问:)