Observer模式的常见错误处理机制是什么?

MTL*_*hil 5 error-handling design-patterns observer-pattern

我正在学习设计模式,我注意到在Observer模式的几乎所有示例实现中都注意到在Subject的register/unregister方法中没有任何错误处理.这让我想知道如何做到这一点.

如何专门处理错误将取决于应用程序的需求,但处理这种错误的常见方法是什么?

例如,我尝试注册观察者但注册失败.该错误是否只是默默地发生,并且该特定观察者不会获得更新是可以接受的?主题是我猜的更聪明,并且可以继续通知观察者DID成功注册.

我注意到我有时很难判断一个程序中错误检查的程度是多少,并想知道这是否是我在考虑每一个意外情况的情况之一.

Tom*_*icz 2

如果注册观察者失败,你肯定应该抛出一些错误。代码的客户端希望收到有关主题更改的通知,并且当他无法做到这一点时,它必须能够做出反应。但未能注册一个观察者根本不会影响主题其他观察者。事实上,您甚至可能有一个观察者注册失败事件的观察者 - 元观察者;-)。

但更有趣的方面恕我直言,当观察者从其方法中抛出异常时会发生什么notify?是否应该召集其他观察员?该观察员是否应该被取消注册?谁对这个错误负责?以及去哪里处理呢?

很少有其他设计模式可以解决这个问题。您可以使用装饰器并包装每个观察者,捕获从它们抛出的异常notify并吞掉它们(ekhem,日志记录)。对象甚至不会注意到,这很好。此外,其他观察者也不会受到干扰,因为异常被足够早地捕获。

还可以考虑使用组合将所有观察者包装成一个虚拟的观察者。然后将其装饰到前面提到的异常捕获观察者中。看起来很相似,但从一个观察者抛出的异常将阻止进一步的观察者被调用。现在你甚至可以形成层次结构......