PHP - 如何捕获'试图获取非对象的属性'错误

Jay*_*Jay 19 php try-catch

我试图用try/catch语句捕获'试图获取非对象的属性'错误但是它失败了,我仍然得到PHP错误.我用作:

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

我的find函数返回一个对象(Active Record),我可以通过object prop访问id列.

但是,如果找不到AR,它将是null对象.我认为try语句会抓住这个.我自己的解决方法是使用isset().但我很困惑为什么try语句不接受并捕获此错误.

dec*_*eze 23

try..catch适用于抛出异常.错误不是例外.你可以沉默错误,但请不要这样做.相反,请正确检查您获得的内容:

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

  • 谢谢。我认为异常与错误是同一个野兽,这是错误的。:) (2认同)

F21*_*F21 6

该模型需要能够抛出异常.

这是您的模型可能的样子:

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

   }
}
Run Code Online (Sandbox Code Playgroud)

然后你会使用你的try/catch块:

try{  

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

}catch(Exception $e){
    echo 'failed';
}
Run Code Online (Sandbox Code Playgroud)

但是,只应在"特殊"情况下抛出异常.我不认为使用例外来指导程序流是正确的方法.

话虽如此,如果在尝试检索ID属性时返回NULL是一种特殊情况,那么异常肯定是合适的.