2

我会假设大多数用户定义的异常都是针对业务逻辑级别的异常,但是使用用户定义的异常有哪些很好的理由,哪些是很好的例子?

用户定义异常的唯一优势是您可以定义一致的错误消息吗?

可以在异常内部编写什么逻辑以使它们真正更有用?

毕竟,你不能这样做:throw new Exception("Some Error Message");

4

6 回答 6

3

拥有用户定义的异常很有用,因为它允许您以特定方式处理不同类型的错误。如果 .NET 可以将所有异常都作为 System.Exception 抛出不同的文本消息,为什么还要定义这么多不同类型的异常?.NET 中有不同类型的异常的原因是您可以捕获单个类型的错误并以不同的方式处理它们。这与您定义自己的用户异常的原因相同 - 这样您就可以根据发生的异常类型提供不同的响应。

您还可以创建包含附加数据的用户定义异常。例如,您可以根据枚举、整数错误代码或任何其他可能对调用程序识别问题有用的东西来定义严重性级别。至于要包含在异常中的逻辑,我通常只是尝试报告出了什么问题,并将逻辑(如何处理错误)留给调用程序。在某些情况下,如果异常代码超过了某个严重级别(例如,抛出警告但只将严重错误写入日志文件),我会让异常代码自动将错误写入日志文件。

于 2010-04-08T14:28:58.260 回答
2

您应该创建很少的用户定义异常。仅当有人要捕获异常并对其执行特定操作时才应使用它们。如果抛出异常而不是InvalidOperationException不会使代码表现不同,那么 throw InvalidOperationException

于 2010-04-08T14:22:17.190 回答
2

.NET 框架中已经有很多异常,如果你能找到一个可以用于你的特殊情况,你应该使用它们。

ConfigurationManager例如,在我的配置类(通常ConfigurationErrorsException是 .

当从文本或其他需要特定格式的东西解析自定义值并且解析失败时,我抛出一个FormatException

但是,如果我的BankAccount对象没有足够的钱让我提取 10 英镑,那么我会写信并扔掉InsufficentFundsException,因为这样我就可以处理那个特定的错误情况,如果它发生的话。

希望这(有点)有帮助。

于 2010-04-08T14:30:05.993 回答
1

不,它们不仅用于消息。您可以在 catch 块的异常列表中查找用户定义的。

catch(UserDefinedException){}
catch(Exception){}

您可以随时使用用户定义的异常来查找发生的特定事件。可能客户端 ID 超出了指定范围,而您想专门查找它。不必解析错误消息(这可能很痛苦,并且容易出错,例如消息在以后发生变化),您使用了一个异常并且您知道代码中的其他地方特别说明你“嘿,这件事发生了。你需要意识到这一点。”

于 2010-04-08T14:20:02.057 回答
1

用户定义的异常可以在组件中使用,以使组件的使用者能够以比 catch (Exception) 块更大的粒度级别捕获它们。这将为组件使用者提供执行不同任务的能力,具体取决于抛出的异常。只有当真正期望消费者会使用它们以这种方式进行区分时,才应该真正创建用户定义的异常。

于 2010-04-08T14:24:02.700 回答
1

您还可以添加属性来存储具有用户定义异常的附加元数据,例如错误代码(例如在调用非托管 API 时)。这比简单地将内容放入 Exception 对象的 Data 属性中更加用户友好。

于 2010-04-08T14:24:35.800 回答