在我的PHP项目中,Observer Pattern随处可见,例如:
foreach ($this->_aObserver as $observer)
{
$observer->vOnUpdate();
}
但是,如果一个观察者由于致命错误或未捕获的异常而关闭,则其他观察者将不会被触发。
那么有什么办法解决这个问题?
答案 0 :(得分:1)
假设您自己在实现观察者模式,并且观察者关闭,则意味着抛出异常,您可以将方法调用包装在try...catch
中。参见http://php.net/manual/en/language.exceptions.php
foreach ($this->_aObserver as $observer)
{
try {
$observer->vOnUpdate();
} catch (\Exception $exception) {
// do something with the error or just move on?
}
}
对于致命错误捕获,您必须创建一个函数来捕获致命错误并基本将其忽略。不推荐这样做,致命错误并不意味着可以恢复。参见:http://php.net/manual/en/function.register-shutdown-function.php
答案 1 :(得分:0)
尝试使用try catch
foreach ($this->_aObserver as $observer)
{
try {
$observer->vOnUpdate();
} catch(\Exception $e) {
// log message
}
}
答案 2 :(得分:0)
您可以检查该方法是否存在,如果是,则调用它。
foreach ($this->_aObserver as $observer)
{
try {
if (method_exists($observer, 'vOnUpdate')) {
$observer->vOnUpdate();
}
} catch(\Exception $e) {
// echo 'Caught exception: '.$e->getMessage();
}
}