Novocaine
Novocaine

Reputation: 4786

Laravel try / catch on not working

I've searched a few questions for a reason my code is not throwing an error correctly, but I can't figure it out.

I have the following function in my controller

<?php
public function suspend($id)
{
    try {
        $this->collection = $this->class::find($id);

        $this->collection->delete();

        return $this->respond_with_success();

    } catch (\Exception $e) {

        return $this->respond_with_error('Failed to suspend resource with id: ' . $id);
    }
}

For reference, I'm using soft deletes. I can suspend a resource once no problem. If I try to suspend one that's already suspended, Laravel correctly throws a 500 as I can see in the log file /storage/logs/laravel.log

This is part of the error I see;

local.ERROR: Call to a member function delete() on null....

Without using withTrashed() in the query, a row quite obviously cannot be found. So this makes sense.

Great...so why does my catch not actually catch anything? I see a 500 error in the browser, but my application should allow me to continue and handle that error correctly. But it just falls over completely...

The respond_with_error function is below. I've tried changing the $code to 200 in testing, but this doesn't change anything. I've tested returning a simple string rather than with this function to no avail, so I don't think there's anything wrong with this part.

<?php
protected function respond_with_error($message = 'error', $code = 500)
{
    return Response::json([
        'success' => false,
        'message' => $message,
    ], $code);
}

I'm running Laravel 5.6.29

Upvotes: 1

Views: 2762

Answers (1)

Devon Bessemer
Devon Bessemer

Reputation: 35357

There are two ways to address this. The first thing to note is ERROR: Call to a member function delete() on null is not an exception, it is a fatal error.

  1. You can use findOrFail instead of find to throw an Exception when the model is not found and that will work.

  2. You could also catch Throwable instead of Exception to catch errors and exceptions (as of PHP7) or just Error to catch errors.

As the Error hierarchy does not inherit from Exception, code that uses catch (Exception $e) { ... } blocks to handle uncaught exceptions in PHP 5 will find that these Errors are not caught by these blocks. Either a catch (Error $e) { ... } block or a set_exception_handler() handler is required.

Read more on PHP7 Error Handling here: http://php.net/manual/en/language.errors.php7.php

Upvotes: 4

Related Questions