代码之家  ›  专栏  ›  技术社区  ›  Nam G VU

如何处理自定义异常?

  •  8
  • Nam G VU  · 技术社区  · 14 年前

    我不知道如何处理自定义异常,以及如何处理内置异常。这似乎是个幼稚的问题,但我真的不知道。 你怎么认为?

    7 回复  |  直到 14 年前
        1
  •  11
  •   Andrew Barber Eric Lafortune    14 年前

    不同类型的异常的原因是,允许您使用处理程序只捕获所需的异常,从而让其他异常继续向上堆积。因此,您可以根据异常的类型,为某些偶尔会遇到的情况安排捕获异常。

    实际上,您可能根本不需要经常创建自己的。但是如果你这样做了,那将是因为你需要能够抛出和捕获一个比可用的更具体的异常类型,也许还需要附加额外的信息。

        2
  •  8
  •   Mark Byers    14 年前

    在以下情况下创建自定义异常非常有用:

    • 没有表示您的错误条件类型的内置异常。
    • 您希望只捕获特定类型的异常,而不捕获来自框架的异常。

    但通常,如果框架中已经存在可以使用的异常,那么最好使用它,而不是为相同的事情创建自己的异常。

        3
  •  6
  •   Albin Sunnanbo    14 年前

    您可以使用它为与您的应用程序相关的事情实现特殊的错误处理。假设您构建了一个香蕉应用程序,那么您可以 OutOfBananasException . 如果您的应用程序出了问题,您可以抛出异常并在以后通过特殊的错误处理来捕获它。

    try
    {
        EatBananas();
    }
    catch(OutOfBananasException oobe)
    {
        GetMoreBananas();
    }
    catch(Exception e)
    {
        TellUserAndAbort();
    }
    

    编辑:
    使用您自己的异常而不是内置异常的原因是要向所有阅读您的代码或使用您的库的人清楚发生了什么类型的错误。只有在找不到任何合适的内置异常时,才应创建自己的异常。

    编辑2:
    对于您自己的异常,您可以做的一件事是添加一些描述错误处理程序可能使用的错误条件的属性。如果您有一个与客户相关的异常,那么您的异常可能具有客户名称和客户ID的属性,从而使错误处理程序能够向用户显示信息性的错误消息。

        4
  •  3
  •   Lasse V. Karlsen    14 年前

    在.NET中只有少数例外以特殊方式处理,比如 ThreadAbortException 不能被抓住、处理和吞咽。

    除此之外,异常类型只是异常类型。您可以对自己的异常执行与框架中定义的异常相同的操作。

        5
  •  3
  •   Ohad Schneider    14 年前

    这里概述了自定义例外的好处,但在创建自己的例外之前,请确保BCL还没有一个适合您的需要:

    http://mikevallotton.wordpress.com/2009/07/08/net-exceptions-all-of-them/ (其中有141个!)

        6
  •  3
  •   supercat    14 年前

    对内置异常的一个恼火之处是,没有系统地区分表示

    1. 操作失败,但重试可能成功;系统状态与尝试操作之前的状态相同。
    2. 操作失败,重试不太可能有帮助;但是,系统状态与尝试操作之前一样;
    3. 操作失败,可能会损坏其他内容。

    根据捕获异常的位置,捕获异常并重新引发三个自定义异常(定义见上文)中的一个可能很有用。当异常为rethrown时,将原始异常作为innerException参数传递。

    顺便说一下,可以定义一般的异常。我不太确定这样做的利弊,而且我从未见过其他人这样做。例如,可以定义从(自定义)TransientFaultException继承的TransientFaultException(属于T);捕获TimeoutException的应用程序可以作为TransientFaultException(属于TimeoutException)重新引发,并将其捕获为TransientFaultException(属于TimeoutException)或TransientFaultException。不幸的是,我们必须知道要学习的异常类型,才能创建合适的泛型。如果要捕获异常并将其传递给工厂方法进行TransientFaultException,则新异常的类型将为TransientFaultException(属于异常),而不考虑最初引发的异常类型。

        7
  •  2
  •   cjk    14 年前

    自定义异常允许您做两件事:

    1. 捕获异常中的自定义类型数据
    2. 捕获自定义异常事件

    只有当没有需要处理的内置异常时,才应创建自定义异常。

    例如,在我们的应用程序中 DataLayerException 当数据层遇到错误时抛出(并将特定DBMS异常作为内部异常包括在内)。

    我们也有 DataLayerSingleResultNoneException -当我们期待一个结果回来,但没有结果时,以及 DataLayerSingleResultManyException 这就是我们期望得到一个结果,但却得到很多回报的时候。这使我们能够抓住不同的问题,并相应地采取行动。