异常会破坏封装吗?

时间:2011-11-09 14:34:50

标签: exception-handling encapsulation

首先,当您不想担心实现的细节时,会创建一个类或库,但是您需要知道该类的内部工作方式才能正确处理它可能抛出的异常。

这是否打破了封装和信息隐藏的原则?或者我对此完全错了?

当然,我可以使用通用的try / catch块来拦截所有异常,但这绝对是一种不好的做法。

那么如何在不知道可能引发的每个异常的详细信息的情况下如何提出良好的异常处理策略呢?

4 个答案:

答案 0 :(得分:3)

类库不必抛出其代码抛出的相同异常。对于无法在内部处理的预期异常,它应该映射到备用异常类型,其中API使用者不容易理解“原始”异常。 API使用者应该能够将预期的异常视为API的输出,就像使用API​​的任何其他产品一样。另一方面,意外的例外是API开发人员和消费者的另一个蜡球......

答案 1 :(得分:2)

一个设计良好的类或库将记录它作为接口的一部分抛出的异常,甚至可能甚至可以定义自己的异常类层次结构。例如,如果磁盘已满,则foo子类可能会抛出“foo持久性异常”,如果网络已关闭,则另一个子类将抛出一个。作为调用者,您将捕获foo持久性异常,因为您担心数据不会持久存在。您不应期望专门为磁盘已满,网络故障,磁盘不存在,磁盘写入错误,子空间收发器干扰和& c编写代码。

可能是你不能对其中很多人做很多事情。

答案 2 :(得分:0)

不是那样的;它适用于使用最终产品的最终用户或“不需要知道内部实现”的类,但您肯定会知道它,因此可以相应地处理错误机制。

BTW,这就是任何API都带有良好文档的原因......所以其他开发人员至少知道它的内部工作。

希望这清除了这个想法。

答案 3 :(得分:0)

  

首先,当您不想要时,会创建一个类或库   担心实现的细节,但是你需要   知道类的内部工作方式以正确处理异常   它可能会抛出。

     

这不会打破封装和信息的原则   藏起来?或者我对此完全错了?

当calee由于某些运行时错误而无法履行其承诺并且无法从该状态恢复时,应抛​​出异常。必须在接口/文档中指定可抛出的异常。我不知道这是如何破坏封装的。另一方面,使用返回代码无法强制调用者处理异常错误,即使明确忽略它也是如此。

  

当然,我可以使用通用的try / catch块来拦截所有异常,   但这绝对是一种不好的做法。

如果您使用的界面的设计者没有明确指出可以抛出哪些异常以及由谁/ what_function

  

那么如何在没有的情况下提出良好的异常处理策略   知道可能抛出的每个异常的细节吗?

“细节”实际上是例外规范,这就是您需要知道的全部内容。同样,它应该是文档/界面的一部分。

无论如何,异常应该很少发生,这可能就是为什么有人将它们命名为异常。如果它经常发生,那么有人不会再将它们命名为异常,而是“常规”或其他东西,正常的,无异常的“代码”将成为例外:)

如果你在try / catch bollocks上工作太多,那么代码就会出错。