PHP - Как отловить ошибку «Попытка получить свойство не-объекта» - PullRequest
19 голосов
/ 16 июля 2011

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

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

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

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

Ответы [ 2 ]

23 голосов
/ 16 июля 2011

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

$result = Model()->find('id=1');
if ($result) {
    $id = $result->id;
} else {
    // handle this situation
}
6 голосов
/ 16 июля 2011

Модель должна иметь возможность генерировать исключение.

Вот как может выглядеть ваша модель:

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 является исключительной ситуацией, то исключения, безусловно, подходят.

...