PHP - 如何捕获“尝试获取非对象的属性”错误

2022-08-30 18:30:06

我试图用try/catch语句捕获“试图获取非对象的属性”错误,但它失败了,我仍然得到一个PHP错误。我使用:

try{
  $id = Model()->find('id=1')->id;
}catch(Exception $e){
  echo 'failed';
}

我的 find 函数返回一个对象(活动记录),并且我可以通过对象 prop 访问 id 列,如所示。

但是,如果未找到 AR,它将是空对象。我以为 try 语句会抓住这一点。我自己的解决方法是使用 isset()。但是我对为什么try语句不接受并捕获此错误感到困惑。


答案 1

try..catch处理引发的异常错误不是例外。您可以静音错误,但请不要这样做。相反,请正确检查您获得的内容:

$result = Model()->find('id=1');
if ($result) {
    $id = $result->id;
} else {
    // handle this situation
}

答案 2

模型需要能够引发异常。

以下是您的模型可能如下所示:

class Model{

   public function find($id){
      $result = //do stuff to find by id

      if (!isset($result)){
          throw new Exception("No result was found for id:$id");
      }
      return $result

   }
}

然后,您将使用 try/catch 块:

try{  

    $id = Model()->find('id=1')->id;

}catch(Exception $e){
    echo 'failed';
}

但是,只有在“特殊”情况下才应引发异常。我不认为使用异常来指导程序流是正确的方法。

话虽如此,如果在尝试检索 ID 属性时返回 NULL 是一种例外情况,则例外肯定是合适的。


推荐