Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP - How to catch a 'Trying to get property of non-object' error

Tags:

I am trying to catch 'Trying to get property of non-object' error with a try/catch statement but it is failing, I still get a PHP error. I am using as:

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

My find function returns an object (Active Record) and I can access the id column as shown via object prop.

However, it will be null object if AR is not found. I thought the try statement would catch this. A work around for myself would be to use an isset(). But I am confused as to why the try statement does not accept and catch this error.

like image 597
Jay Avatar asked Jul 16 '11 01:07

Jay


2 Answers

try..catch works on thrown exceptions. Errors are not exceptions. You can silence errors, but please don't do that. Instead, properly check what you're getting:

$result = Model()->find('id=1'); if ($result) {     $id = $result->id; } else {     // handle this situation } 
like image 178
deceze Avatar answered Oct 05 '22 15:10

deceze


The model needs to be able to throw an exception.

Here's what your model might look like:

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     } } 

Then you would use your try/catch block:

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

However, exceptions should only be thrown under "exceptional" circumstances. I don't think using exceptions to direct program flow is the right way to go about it.

Having said that, if returning a NULL when you attempt to retrieve the ID property is an exceptional situation, then exceptions are certainly suitable.

like image 34
F21 Avatar answered Oct 05 '22 14:10

F21