如何“全局”捕获对象实例中抛出的exception

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

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

这种方法运行良好,可以处理应用程序exception情况。

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

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; } 

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

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

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

如果我按如下方式更新代码,我可以使用该方法,明确调用连接到Application.ThreadException的事件处理程序。 这是Enterprise Library示例中概述的方法。 然而,这种方法要求我包装try catch中抛出的任何exception,这是我试图通过使用“全局”处理程序来避免的。

 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事件,但是这也没有捕获exception。

如果有人可以向我解释为什么我的exception没有被第一个代码示例中的全局exception处理程序捕获,我会很高兴。 是否有其他方法我缺少或我是否坚持使用try catch包装代码,如上所示,根据需要?

作为一个想法,尝试添加(相当早 – 即在Main的开头):

 Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 

那就是说 – 无论有没有,它对我来说似乎都很好……

根据MSDN ,只有在未处理exception时才会触发Application.ThreadException 。 也许在处理exception的callstack的某个地方有一个catch

另一种选择是尝试使用AppDomain.UnhandledException 。 它与Application.ThreadException相同,但它适用于同一AppDomain中的所有exception。

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

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