任何人都可以了解抛出自定义异常(继承自System.Exception)的优缺点,或者使用它们的正确方法?我已经知道何时/何时不抛出异常,但我正在寻找有关如何创建自己的自定义异常的指导。
答案 0 :(得分:9)
实际上有很多关于这个主题的MSDN文章:
答案 1 :(得分:9)
这些都是很棒的帖子。到目前为止,我最同意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
,则无法区分为什么抛出异常的不同原因。
答案 2 :(得分:4)
使用您自己的例外来标记特定于您的应用程序/域的错误。优点是你的catch块可以过滤正确的异常并对其采取行动。对其他一切使用特定的标准例外。
答案 3 :(得分:1)
自定义例外允许您提供清晰,有意义的例外,这反过来可以使您的库更有用,只要您在适当的时候使用现有的例外。
在需要引发不直接适合框架异常模型的异常时,创建自定义异常。
答案 4 :(得分:1)
我最近写了一篇关于这个特定主题的完整博客文章:
基本摘要虽然是......
如果您希望开发人员针对问题采取纠正措施或记录事后调试,则应该只创建新的异常。
答案 5 :(得分:1)