【问题标题】:PHP errors / exceptions in loop prevent further iterations循环中的 PHP 错误/异常阻止了进一步的迭代
【发布时间】:2018-08-10 03:39:29
【问题描述】:

在我的PHP项目中,观察者模式无处不在,比如:

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

但如果一个观察者因致命错误未捕获异常而关闭,则其余观察者无法被触发。

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

【问题讨论】:

  • 对于“致命错误”,您无能为力

标签: php observer-pattern


【解决方案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

【讨论】:

  • zh...如果一个观察者因为致命错误或未捕获异常而关闭,它不起作用...
【解决方案2】:

尝试使用try catch

foreach ($this->_aObserver as $observer)
{
    try {
        $observer->vOnUpdate();
    } catch(\Exception $e) {
      //  log message
    }

}

【讨论】:

    【解决方案3】:

    你可以检查方法是否存在,如果存在就调用它。

    foreach ($this->_aObserver as $observer)
    {
      try {
        if (method_exists($observer, 'vOnUpdate')) {
          $observer->vOnUpdate();
        }
      } catch(\Exception $e) {
        // echo 'Caught exception: '.$e->getMessage();
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-04
      • 2021-04-19
      • 1970-01-01
      相关资源
      最近更新 更多