.NET抛出自定义异常

10

有人可以阐明一下抛出自定义异常(继承自System.Exception)的利弊或者正确使用它们的方法吗?我已经了解了何时/何时不应该抛出异常,但我正在寻求关于如何创建自己的自定义异常的指导。


1
重复:https://dev59.com/NnRC5IYBdhLWcg3wFM_W - Jay Riggs
我不会把这个称为重复,虽然很接近,但在我的看法中还不够,也许我在问题描述上没有表达清楚。 - andrewWinn
这篇文章的措辞肯定比链接中的重复问题更好。如果它被关闭,我会投票支持重新开放。 - Randolpho
6个回答

9

这些都是很好的帖子。到目前为止,我最同意Brian Rasmussen的观点——当您想要处理不同类型的特定异常时,请创建自定义异常。

也许一个例子会有所帮助。这是一个虚构的例子,在日常代码中可能有用,也可能没有用。假设您有一个负责验证用户的类。除了验证用户之外,该类还具有锁定机制,以在多次失败尝试后锁定用户。在这种情况下,您可以设计两个自定义异常作为类的一部分:AuthenticationFailedExceptionUserLockedOutException。然后,如果成功验证用户,则您的AuthenticateUser方法将简单地返回而不抛出异常;如果用户未通过身份验证,则抛出AuthenticationFailedException;如果用户被锁定,则抛出UserLockedOutException

例如:

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类的用户以不同的方式处理每个自定义异常。如果AuthenticateUser方法只是简单地抛出了Exception,那么就没有办法区分不同的原因,即为什么会抛出异常。



4

使用自己的异常来标记与您的应用程序/领域特定的错误。优点是您的catch块可以过滤正确的异常并采取相应措施。对于其他所有内容,请使用特定的标准异常。


1

自定义异常允许您提供清晰、有意义的异常,从而可以使您的库更易于使用,前提是在适当的情况下使用现有的异常。

每当需要引发不直接符合框架异常模型的异常时,请创建自定义异常。


1


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接