任何人都可以阐明抛出自定义异常(从System.Exception继承)的优点和缺点,或正确的方式来使用它们吗?我已经知道何时/何时不抛出异常,但我正在寻找如何创建自己的自定义异常的指导。.NET抛出自定义异常
回答
这些都是很棒的贴子。到目前为止,我最同意Brian Rasmussen - 当你想处理不同类型的特定异常时创建自定义异常。
也许一个例子会有所帮助。这是一个人为的例子,在日常代码中可能有用或不用。假设你有一个负责认证用户的类。除了对用户进行身份验证之外,该课程还有一个锁定机制,可在几次失败尝试后锁定用户。在这种情况下,您可以将其设计为类别2自定义例外的一部分: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
,那么将不可能区分不同的原因为什么抛出了异常。
很好的解释,用例子得到我的接受票。 – andrewWinn 2009-10-15 16:23:08
自定义异常允许您提供清晰,有意义的异常,这反过来可以使您的库更加可用,前提是您在适当的时候使用现有异常。
无论何时您需要引发不适合直接放入框架异常模型的异常,您都可以创建自定义异常。
使用您自己的例外来标记特定于您的应用程序/域的错误。优点是你的catch块可以过滤正确的异常并根据这些异常行事。对于其他所有使用特定的标准例外。
我最近写了一篇关于这个问题的整个博客条目:
- http://blogs.msdn.com/jaredpar/archive/2008/10/20/custom-exceptions-when-should-you-create-them.aspx
的基本概括,虽然是...
您应该只创建一个新的异常如果您希望开发人员针对该问题采取纠正措施或记录事后调试。
- 1. 抛出自定义异常
- 2. 抛出自定义异常
- 3. 在Java中抛出自定义异常与在异常中抛出异常
- 4. 自定义键盘抛出异常
- 5. 抛出自定义Java异常
- 6. Kotlin - 抛出自定义异常
- 7. 抛出和捕获自定义异常
- 8. 从SSRS抛出自定义异常
- 9. 在Servlet中抛出自定义异常
- 10. 抛出时抛出自定义Java异常
- 11. 从捕捉异常策略中抛出自定义异常
- 12. 获取自定义消息出来抛出自定义异常的
- 13. 预抛钩自定义异常?
- 14. C#明确定义抛出的异常
- 15. XmlJavaTypeAdapter抛出用户定义的异常
- 16. 自动映射器自定义解析器抛出空异常
- 17. .NET自定义配置部分:Configuration.GetSection抛出'无法找到程序集'异常
- 18. 魔术异常抛出抛出异常
- 19. 抛出异常抛出异常
- 20. Java:抛出自身异常(?)
- 21. 抛出自定义的异常收集信息并再次抛出
- 22. 如何为自定义异常类型关闭“抛出异常时中断”
- 23. 如何抛出自定义异常时,异常的类型被构造
- 24. 使用抛出包含未知异常到自定义异常的建议
- 25. 确定抛出异常?
- 26. 自定义配置节处理程序抛出异常
- 27. 自定义抛出异常的错误信息javascript
- 28. JAX-WS客户端抛出SOAPFaultException而不是自定义异常
- 29. 为什么我的自定义HttpResponse在HttpResponse.End()上抛出异常?
- 30. 自定义异常抛出正在打印为空的消息
杜佩:http://stackoverflow.com/questions/417428/why-create-custom-exceptions – 2009-10-15 15:34:45
我不会把这看作是一个愚蠢的事情,关闭,但不在我的书中,也许我的问题不够清楚。 – andrewWinn 2009-10-15 15:37:11
这当然是一个比链接副本更好的措辞。如果关闭,我将投票重新开放。 – Randolpho 2009-10-15 15:45:55