PHP错误/循环中的异常阻止了进一步的迭代

时间:2018-08-10 03:39:30

标签: php observer-pattern

在我的PHP项目中,Observer Pattern随处可见,例如:

foreach ($this->_aObserver as $observer)
{
    $observer->vOnUpdate();
}

但是,如果一个观察者由于致命错误未捕获的异常而关闭,则其他观察者将不会被触发。

那么有什么办法解决这个问题?

3 个答案:

答案 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();
  }
}