何时使用用户定义的Exception和一些好的示例/最佳实践?

时间:2010-04-08 14:17:18

标签: c# asp.net exception user-defined

我认为大多数用户定义的异常都是针对业务逻辑级异常的,但是使用用户定义的异常的一些好理由是什么?有什么好例子?

用户定义的异常是否可以定义一致的错误消息?

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

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

6 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

您应该创建很少的用户定义的异常。只有当有人要捕获异常并做一些特定的事情时才应该使用它们。如果抛出异常而不是InvalidOperationException不会使代码的行为不同,那么抛出InvalidOperationException

答案 2 :(得分:2)

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

例如,在我的配置类(通常是ConfigurationManager周围的包装器)中,当无法正确解析值时,我抛出ConfigurationErrorsException

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

但是,如果我的BankAccount对象没有足够的钱让我退出10英镑那么我会写并抛出InsufficentFundsException,因为那样我可以处理那个特定的错误情况,如果它发生了。

希望这(有点)有所帮助。

答案 3 :(得分:1)

不,它们不仅适用于消息。您可以在catch块的例外列表中查找用户定义的那些。

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

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

答案 4 :(得分:1)

可以在组件中使用用户定义的异常,以允许组件的使用者能够以更高的粒度级别捕获它们,然后捕获(异常)块。这将为组件使用者提供基于抛出异常执行不同任务的能力。只有在真正期望消费者使用它们以这种方式区分时,才能真正创建用户定义的异常。

答案 5 :(得分:1)

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