有人可以阐明一下抛出自定义异常(继承自System.Exception)的利弊或者正确使用它们的方法吗?我已经了解了何时/何时不应该抛出异常,但我正在寻求关于如何创建自己的自定义异常的指导。
这些都是很好的帖子。到目前为止,我最同意Brian Rasmussen的观点——当您想要处理不同类型的特定异常时,请创建自定义异常。
也许一个例子会有所帮助。这是一个虚构的例子,在日常代码中可能有用,也可能没有用。假设您有一个负责验证用户的类。除了验证用户之外,该类还具有锁定机制,以在多次失败尝试后锁定用户。在这种情况下,您可以设计两个自定义异常作为类的一部分:AuthenticationFailedException
和UserLockedOutException
。然后,如果成功验证用户,则您的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
,那么就没有办法区分不同的原因,即为什么会抛出异常。
使用自己的异常来标记与您的应用程序/领域特定的错误。优点是您的catch块可以过滤正确的异常并采取相应措施。对于其他所有内容,请使用特定的标准异常。
自定义异常允许您提供清晰、有意义的异常,从而可以使您的库更易于使用,前提是在适当的情况下使用现有的异常。
每当需要引发不直接符合框架异常模型的异常时,请创建自定义异常。
我最近写了一篇关于这个特定主题的博客文章:
只有在您期望开发人员采取纠正措施或记录后期调试时,才应创建新的异常。