Я пытаюсь поймать ошибку «Попытка получить свойство не-объекта» с помощью инструкции 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, это исключительная ситуация, поэтому исключения, безусловно, подходят.