2009-10-15 104 views
10

任何人都可以阐明抛出自定义异常(从System.Exception继承)的优点和缺点,或正确的方式来使用它们吗?我已经知道何时/何时不抛出异常,但我正在寻找如何创建自己的自定义异常的指导。.NET抛出自定义异常

+1

杜佩:http://stackoverflow.com/questions/417428/why-create-custom-exceptions – 2009-10-15 15:34:45

+0

我不会把这看作是一个愚蠢的事情,关闭,但不在我的书中,也许我的问题不够清楚。 – andrewWinn 2009-10-15 15:37:11

+0

这当然是一个比链接副本更好的措辞。如果关闭,我将投票重新开放。 – Randolpho 2009-10-15 15:45:55

回答

9

这些都是很棒的贴子。到目前为止,我最同意Brian Rasmussen - 当你想处理不同类型的特定异常时创建自定义异常。

也许一个例子会有所帮助。这是一个人为的例子,在日常代码中可能有用或不用。假设你有一个负责认证用户的类。除了对用户进行身份验证之外,该课程还有一个锁定机制,可在几次失败尝试后锁定用户。在这种情况下,您可以将其设计为类别2自定义例外的一部分: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,那么将不可能区分不同的原因为什么抛出了异常。

+1

很好的解释,用例子得到我的接受票。 – andrewWinn 2009-10-15 16:23:08

1

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

无论何时您需要引发不适合直接放入框架异常模型的异常,您都可以创建自定义异常。

4

使用您自己的例外来标记特定于您的应用程序/域的错误。优点是你的catch块可以过滤正确的异常并根据这些异常行事。对于其他所有使用特定的标准例外。