应用程序域未处理异常

9
我正在开发一个C#项目,希望利用UnhandledException事件来捕获我可能在项目中错过的任何异常(希望没有但为了保险起见)。
我制作了很多软件,所以我想制作一个类库,所有我的项目都将使用它,因此我希望有一个函数可以完成所有项目的初始化工作,而无需我将代码复制并粘贴到每个项目中以执行相同的工作。
我想知道的是,如果在类库中使用以下代码进行未处理异常事件:
AppDomain currentDomain = AppDomain.CurrentDomain;
            currentDomain.UnhandledException += new UnhandledExceptionEventHandler(currentDomain_UnhandledException);

未处理的异常只会在类库内部使用,还是这个事件处理程序也会在引用该类库的任何项目中执行?

感谢您提供的任何帮助。

2个回答

6
假设您的所有项目都在同一个应用程序域中运行,那么这将正常工作。我们将此确切代码封装在一个常见的 DLL 中,该 DLL 在众多应用程序之间共享。
另一个建议:如果在 Windows Forms 应用程序中使用,则可能还需要添加System.Windows.Forms.Application.ThreadException的处理程序。例如,当某人忘记向控件事件添加异常处理时,这将作为备用方案。

谢谢您的帮助。这是我正在开发的控制台应用程序,但我会注意到关于窗体的ThreadException。这对WPF应用程序也适用吗,还是只适用于旧式Windows窗体? - Boardy

1

可以将程序集加载到不同的应用程序域中,但只要将程序集(如类库)加载到当前应用程序域中,就会处理该异常。

应用程序域和程序集之间的关系:

http://technet.microsoft.com/en-us/subscriptions/index/43wc4hhs(v=vs.80).aspx

例如,Assembly.LoadFile()Assembly.Load()将把程序集加载到当前应用程序域中。
您的代码可以使用以下代码创建新的应用程序域: AppDomain.CreateDomain(..),然后它可以将程序集加载到该域中,这些程序集不会由您的代码处理。
如果您在项目中引用库,则它们将被加载到当前应用程序域中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接