我试图用try / catch语句捕获'试图获取非对象的属性'错误但是它失败了,我仍然得到PHP错误。我用作:
try{
$id = Model()->find('id=1')->id;
}catch(Exception $e){
echo 'failed';
}
我的find函数返回一个对象(Active Record),我可以通过object prop访问id列。
但是,如果找不到AR,它将是null对象。我认为try语句会抓住这个。我自己的解决方法是使用isset()。但我很困惑为什么try语句不接受并捕获此错误。
try..catch
致力于抛出异常。错误不是例外。你可以silence错误,但请不要这样做。相反,请正确检查您获得的内容:
$result = Model()->find('id=1');
if ($result) {
$id = $result->id;
} else {
// handle this situation
}
该模型需要能够抛出异常。
这是您的模型可能的样子:
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是一种特殊情况,那么异常肯定是合适的。