当前位置: 首页 > 编程语言 > C#

如何“全局”捕获对象实例中抛出的异常分享

时间:2023-04-10 12:05:15 C#

如何“全局”捕获对象实例中抛出的异常我目前正在编写一个winforms应用程序(C#)。我正在使用企业库异常处理块,遵循我所见的相当标准的方法。IE:在Program.cs的Main方法中,我将事件处理程序挂接到Application.ThreadException事件等。这种方法效果很好,可以处理应用程序异常。在我的一个业务对象中,我在对象属性之一的Set访问器中抛出各种异常如果(!availableSubMasterWidthSatisfiesAllPatterns(value))thrownewCustomExceptions.InvalidTrimValue("Anothermessage...");_minimumTrim=值;我对这种方法的逻辑(不将其转化为“当抛出异常时”的讨论)只是业务对象负责检查业务规则约束并抛出可以冒泡并根据需要捕获的异常。应该注意的是,在我的应用程序的用户界面中,我明确地检查了正在设置的公共属性的值(并在那里显示友好的对话框等)但是为了抛出异常我也覆盖了我的业务对象的大小写可能不会被用户界面使用,例如:该属性正在由另一个业务对象设置。无论如何,我想你们都明白了。我的问题是这些异常没有被附加到Application.ThreadException的处理程序捕获,我不明白为什么。从其他阅读中我已经完成了Application.ThreadException事件,它处理“...捕获主GUI线程上发生的任何异常”。异常是在我的业务对象中抛出的,而不是在这个线程中抛出的吗?我还没有创建任何新线程。如果我按如下方式更新代码,我可以使用该方法,显式调用附加到Application.ThreadException的事件处理程序。这是企业库示例中概述的方法。但是,这种方法要求我包装在trycatch中抛出的任何异常,我试图通过使用“全局”处理程序来避免这种情况。try{if(value>MaximumTrim)thrownewCustomExceptions.InvalidTrimValue("最小值...");如果(!availableSubMasterWidthSatisfiesAllPatterns(value))thrownewCustomExceptions.InvalidTrimValue("Anothermessage");_minimumTrim=值;}catch(Exceptionex){Program.ThreadExceptionHandler.ProcessUnhandledException(ex);我还研究了将处理程序连接到AppDomain.UnhandledException事件,但这也没有捕获到异常。如果有人能向我解释为什么我的异常没有被第一个代码示例中的全局异常处理程序捕获,我会很高兴。是否有其他方法我遗漏了,或者我是否坚持按照需要用上面所示的trycatch包装代码?作为一个想法,尝试添加(很早-即在Main的开头):Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);就是说-不管有没有...它对我来说似乎都可以正常工作...根据MSDN,仅在Application.ThreadException中仅在未处理异常时才触发。也许在处理异常的调用堆栈中某处有一个捕获?另一种选择是尝试使用AppDomain.UnhandledException。它与Application.ThreadException相同,但它适用于同一AppDomain中的所有异常。如果您尝试Application.ThreadException或AppDomain.CurrentDomain.UnhandledException,调试器将捕获异常!要测试这些方法,您必须在没有调试器的情况下启动应用程序。以上就是C#学习教程:如何“全局”捕获对象实例抛出的异常共享的所有内容。代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: