PHP – Как поймать ошибку «Попытка получить свойство не-объекта»

Я пытаюсь поймать ошибку «Попытка получить свойство не-объекта» с помощью инструкции try / catch, но она терпит неудачу, я все равно получаю ошибку PHP. Я использую как:

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

Моя функция поиска возвращает объект (активная запись), и я могу получить доступ к столбцу id, как показано через функцию prop.

Тем не менее, это будет пустой объект, если AR не найден. Я думал, что попытка try поймает это. Работа для себя будет заключаться в использовании isset (). Но я смущен, почему оператор try не принимает и не улавливает эту ошибку.

try..catch работает над исключениями throw n. Ошибки не throw n, и они не являются исключениями. Вы можете отключить ошибки, но, пожалуйста, не делайте этого. Вместо этого правильно проверьте, что вы получаете:

 $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'; } 

Однако исключения следует отбрасывать только при «исключительных» обстоятельствах. Я не думаю, что использование исключений для прямого потока программы – это правильный путь.

Сказав, что при возврате NULL, когда вы пытаетесь восстановить свойство ID, это исключительная ситуация, поэтому исключения, безусловно, подходят.