gpt4 book ai didi

c# - 'globally'如何捕获对象实例中抛出的异常

转载 作者:行者123 更新时间:2023-11-30 18:45:16 25 4
gpt4 key购买 nike

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

我正在使用 Enterprise Library Exception Handling Block,按照我所见的相当标准的方法。 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;
}

我对这种方法的逻辑(没有将其变成“何时抛出异常”的讨论)只是业务对象负责检查业务规则约束并抛出一个可以冒泡并根据需要捕获的异常。应该注意的是,在我的应用程序的用户界面中,我确实明确地检查了公共(public)属性被设置为的值(并在那里采取行动显示友好的对话框等)但是抛出异常我也涵盖了我的业务对象的情况可能不会被 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 中包装代码,如上所示,根据需要?

最佳答案

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

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

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

关于c# - 'globally'如何捕获对象实例中抛出的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/601224/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com