3

我目前正在编写一个 winforms 应用程序(C#)。

我正在使用企业库异常处理块,按照我所看到的相当标准的方法。IE:在 Program.cs 的 Main 方法中,我已将事件处理程序连接到 Application.ThreadException 事件等。

这种方法效果很好,可以处理应用程序的异常情况。

在我的一个业务对象中,我在对象属性之一的 Set 访问器中抛出了各种异常

set {

   if (value > MaximumTrim)
    throw new CustomExceptions.InvalidTrimValue("The value of the minimum trim...");

   if (!availableSubMasterWidthSatisfiesAllPatterns(value))
        throw new CustomExceptions.InvalidTrimValue("Another message...");

   _minimumTrim = value;
}

我对这种方法的逻辑(没有把它变成“何时抛出异常”的讨论)只是业务对象负责检查业务规则约束并抛出一个可以根据需要冒泡并被捕获的异常。应该注意的是,在我的应用程序的 UI 中,我确实明确检查了公共属性设置为的值(并在那里采取行动,显示友好的对话框等)但是抛出异常我也涵盖了我的业务对象的情况UI 可能不会使用该属性,例如:该属性正在由另一个业务对象设置。无论如何,我想你们都明白了。

我的问题是这些异常没有被连接到 Application.ThreadException 的处理程序捕获,我不明白为什么。

从其他阅读中,我完成了 Application.ThreadException 事件,它处理程序“......捕获主 GUI 线程上发生的任何异常”。我的业务对象中引发的异常不在此线程中吗?我还没有创建任何新线程。

如果我按如下方式更新代码,显式调用连接到 Application.ThreadException 的事件处理程序,我可以获得该方法。这是企业库示例中概述的方法。然而,这种方法需要我包装在 try catch 中抛出的任何异常,这是我试图通过使用“全局”处理程序来避免的。

try
{
    if (value > MaximumTrim)
        throw new CustomExceptions.InvalidTrimValue("The value of the minimum...");

    if (!availableSubMasterWidthSatisfiesAllPatterns(value))
        throw new CustomExceptions.InvalidTrimValue("Another message");

    _minimumTrim = value;
}
catch (Exception ex)
{
    Program.ThreadExceptionHandler.ProcessUnhandledException(ex);
}

我还研究了使用将处理程序连接到 AppDomain.UnhandledException 事件,但这也没有捕获异常。

如果有人可以向我解释为什么我的异常没有被第一个代码示例中的全局异常处理程序捕获,我会很好。是否有我遗漏的另一种方法,或者我是否根据需要在 try catch 中使用包装代码,如上所示?

4

3 回答 3

0

作为一个想法,尝试添加(相当早 - 即在开始时Main):

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

就是说-无论有没有……它对我来说似乎都很好。

于 2009-03-02T03:53:26.263 回答
0

根据MSDNApplication.ThreadException只有在未处理异常时才会触发。也许catch调用堆栈上的某个地方正在处理异常?

另一种选择是尝试使用AppDomain.UnhandledException代替。它与 相同Application.ThreadException,只是它适用于相同的所有异常AppDomain

于 2009-03-02T03:55:17.630 回答
0

如果您尝试使用 Application.ThreadException 或 AppDomain.CurrentDomain.UnhandledException调试器捕获异常!

要测试这些方法,您必须在没有调试器的情况下启动应用程序。

于 2010-03-25T09:34:49.877 回答