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

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

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

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

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

Ответы

Ответ 1

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

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

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

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