catch()
子句中构建条件逻辑)。我有点极简主义,只有在调用代码必须显式地响应特定条件才会创建自定义异常。对于所有其他情况,我将使用最适合的 .NET 库异常。例如 ArgumentNullException,InvalidOperationException
当你需要以某种方式区分一个异常时。 就是这样。当然,你也可以创建一个异常类,它采用枚举来区分其原因。
当您想要传递异常的额外信息时,这很容易看出。传递该信息的唯一原因是如果您想要能够稍后获取该信息,因此您将想要知道类型,以便从该类型而不是其他类型中检索信息。
在C++和其他一些语言中,您还可以对异常进行typedef。这将允许类型区分,并可能将来转换为自定义类。
我之前写过一篇关于何时抛出不同类型的异常以及何时创建新的异常类型的博客文章。虽然不是很长,但可能太长了,无法在此处粘贴,敬请谅解。它应该能回答你对于为什么存在不同的异常类型以及如何知道是否需要创建自定义异常的问题。
我使用自定义异常的主要原因是封装多个提供程序:如果一个SqlException泄漏出SqlDataAccess层,而SocketException泄漏出NetworkDataAccess层,则调用代码会依赖于您的实现细节。最好将它们包装成DataAccessException或其他异常。
我认为简单的答案是“在没有现有异常充分表达异常情况时创建自定义异常。”
我还有第二条规则:“仅在您期望开发人员能够处理异常时才创建自定义异常。”如果您不认为异常是可恢复的条件,则创建新异常没有意义。在这种情况下,抛出InvalidOperationException更有效率。
编辑:最终撰写了一篇关于此主题的博客文章:http://blogs.msdn.com/jaredpar/archive/2008/10/20/custom-exceptions-when-should-you-create-them.aspx