Catto
Catto

Reputation: 528

Laravel create custom exception with parameters & return as JSON

I want to throw a custom exception if the variable is null and return it as JSON. I've tried like this:

Controller

try {
    $check_api_key = $attendance_libraries->check_api_key($this->request);
    if ($check_api_key == null) {
        throw new NullException(false, 'API Key Not Found', null, 500);
    }
} catch (NullException $e) {
    return $e;
} catch (\Exception $e) {
    // do something else           
}

Custom Exception

<?php

namespace App\Exceptions;

use Exception;
use Illuminate\Http\Response;

class NullException extends Exception
{
    public $is_success;
    public $message;
    public $code;
    public $data;

    public function __construct($is_success, $message, $code, $data = null, Exception $previous = NULL)
    {
        $this->is_success = $is_success;
        $this->message = $message;
        $this->code = $code;
        $this->data = $data;
    }

    public function render()
    {
        return response()->json([
            'success' => $this->is_success,
            'message' => $this->message,
            'data' => $this->data,
        ], $this->code);
    }
}

But when I am trying to test it using postman, the return I got is not the same as I wrote in NullException. It becomes like this: Postman response

Upvotes: 5

Views: 6165

Answers (2)

Ramy Herrira
Ramy Herrira

Reputation: 624

In your case you are returning the exception as a response instead of throwing it. That's why it's displayed like this.

You could just have to throw the exception without the try/catch:

$check_api_key = $attendance_libraries->check_api_key($this->request);

if ($check_api_key == null) {
    throw new NullException(false, 'API Key Not Found', null, 500);
}

The laravel error handler will catch the exception & render it.

EDIT: Or as @miken32 pointed out you could re throw the exception to handle other exceptions:

try {
 //...
} catch (NullException $e) {
  throw $e;
} catch (// other exceptions) {
}

enter image description here

Upvotes: 2

ManojKiran
ManojKiran

Reputation: 6341

Instead of Returning the render method from Exception you are returning the Exception. And also you are passing the arguments in wrong order.

Route::get('exception', function () {
    try {
        $check_api_key = null;

        if ($check_api_key == null) {
            throw new NullException(
                is_success: false,
                message: "API Key Not Found",
                code: 500
            );
        }
    } catch (NullException $e) {
        return $e->render();
    } catch (\Exception $e) {
    }
});

Upvotes: 1

Related Questions