代码之家  ›  专栏  ›  技术社区  ›  andrewWinn

.NET引发自定义异常

  •  10
  • andrewWinn  · 技术社区  · 15 年前

    有人能解释一下抛出自定义异常(继承自System.Exception)的利弊吗,或者使用自定义异常的正确方法?我已经知道何时不抛出异常,但我正在寻找关于如何创建自己的自定义异常的指导。

    6 回复  |  直到 12 年前
        1
  •  9
  •   Randolpho    15 年前

    这些都是很好的职位。到目前为止,我最赞同BrianRasmussen的观点——当您想要处理不同类型的特定异常时,可以创建自定义异常。

    也许举个例子会有所帮助。这是一个人为的例子,在日常代码中可能有用,也可能不有用。假设有一个类负责对用户进行身份验证。这个类除了对用户进行身份验证外,还有一个锁定机制,用于在多次尝试失败后锁定用户。在这种情况下,您可以设计为类2自定义异常的一部分: AuthenticationFailedException UserLockedOutException . 你的 AuthenticateUser 如果用户成功地通过了身份验证,那么方法只返回而不引发 身份验证失败异常 如果用户身份验证失败,或引发 用户锁定异常 如果用户被锁定。

    例如:

    try
    {
        myAuthProvider.AuthenticateUser(username, password);
        ShowAuthSuccessScreen();
    }
    catch(AuthenticationFailedException e)
    {
        LogError(e);
        ShowAuthFailedScreen();
    }
    catch(UserLockedOutException e)
    {
        LogError(e);
        ShowUserLockedOutScreen();
    }
    catch(Exception e)
    {
        LogError(e);
        ShowGeneralErrorScreen();
    }
    

    再一次,一个人为的例子。但希望它能说明您希望如何以及为什么创建自定义异常。在这种情况下, AuthProvider 类以不同的方式处理每个自定义异常。如果 验证器 方法只是抛出 Exception 没有办法区分不同的原因 为什么? 引发了异常。

        3
  •  4
  •   Brian Rasmussen    15 年前

    使用您自己的异常来标记特定于您的应用程序/域的错误。优点是,您的catch块可以过滤正确的异常并对其进行操作。对其他所有内容使用特定的标准异常。

        4
  •  1
  •   Reed Copsey    15 年前

    自定义异常允许您提供清晰、有意义的异常,反过来,如果您在适当的时候使用现有的异常,则可以使库更可用。

    在需要引发不直接适合框架异常模型的异常时,随时创建自定义异常。

        5
  •  1
  •   JaredPar    15 年前

    我最近写了一篇关于这个特定主题的完整博客:

    不过,基本的总结是…

    只有当您希望开发人员对问题采取纠正措施或记录以进行事后调试时,才应该创建一个新的异常。