0

I'm working on handling exceptions in my Laravel project. I'm handling them in the Handler like this:

public function render($request, Exception $exception)
{
    if ($exception instanceof \Illuminate\Database\Eloquent\ModelNotFoundException)  {
        return response()->view('generalerror', ['name'  => 'The requested resource could not be found.', 'error' => $exception->getMessage()]);
    }
    if ($exception instanceof \PDOException)  {
        return response()->view('generalerror', ['name'  => 'There was a problem adding the requested resource', 'error' => $exception->getMessage()]);
    }

    return parent::render($request, $exception);
}

Everything works fine with the ModelNotFoundException. I get the correct message.

Displaying the PDO exception message will result in something like this:

SQLSTATE[HY000]: General error: 1364 Field 'fiscal_code' doesn't have a default value (SQL: insert into `patients` (`surname`, `name`, `POB`, `DOB`, `gender`, `marital_status`, `profession`, `residence`, `telephone_1`, `owner_1`, `telephone_2`, `owner_2`, `telephone_3`, `owner_3`, `updated_at`, `created_at`) values (eyJpdiI6IjBjSXVvVUFkQnBWK2UyN1hhc2JSUVE9PSIsInZhbHVlIjoianNBQjI1OEVvTklEUXhZdUV2TmNQQT09IiwibWFjIjoiODE4MjU3OGM3NzAzZDBlYmNhODI3ZmJkOGMxZGRlM2QxYWJjZTY1MWU5YmZiMGNiYzk4ZTMxYTM3NGM2OGEyOCJ9, eyJpdiI6IjlVZUVcL0pDcDdLdEV5akJ2N0lPRFlnPT0iLCJ2YWx1ZSI6Inh3RjdLSFVpSGtQRjRjT1wvOFdLK2VnPT0iLCJtYWMiOiI5ZDA4MzI3MWM1OTk2ZTJhYThhZDM0OTI1NTE3Y2NhODk4OWRhNWZjNDUzOGJkZDhkNzMyZTE0NmMyOGM0NTQ5In0=, , 1111-11-11, eyJpdiI6IldNSFloZUVmMjFuM1RrRWZHN2NvWVE9PSIsInZhbHVlIjoiRXN3OXZNdlpGMUtRK2VDbTh6ZzFVZz09IiwibWFjIjoiMGNlOTI1YTJlYWI1MzM4OTc4OTAwYWVjMDI1YjVmNDkxZmQ5MjlkMzZiNzg1YWVhOWM2MjQyN2JiZDQ0NDQ2NyJ9, eyJpdiI6Ik1udTVsRWF4NXNuY0Fsc05VdGNqR1E9PSIsInZhbHVlIjoieFB0ZitqZVwvMmxNUVNBUFZVeHRPRVE9PSIsIm1hYyI6IjE3NzNjMGZiMGUyNWU0Y2I4Nzg2YWFiZjc0NGU4NzhmNDU4YTdlNDY5MGYyYjIyNjc5ZTJkODExYTc5YjY0YWMifQ==, eyJpdiI6ImhBbW1EdXZZQ0VEOEJoeTUzMXU3RXc9PSIsInZhbHVlIjoiNjY5UUh3ZlwvYU1MZTlIMkFueFRCQ1E9PSIsIm1hYyI6Ijc1OGU0Nzc4ZWNkYmJlOTVjYzQ5OTI5Mzc2YjRmZjUwMDNhYmYyMjkyYWQ5NDZhNDc2NzFmM2MwMjAxNTU3M2YifQ==, eyJpdiI6IkhuM3Y0SFwvMEh3YTllb2xtNWxUR3Z3PT0iLCJ2YWx1ZSI6ImRLbUlhXC84ZExmd2hCNVlGNlRnZkxBPT0iLCJtYWMiOiI3ZTdmNThhZWNmN2IwZGZhYjBhNjNjN2ZlMzQ3M2ZiYmFlMDlhNmQ2MTJiMTU4YzMzM2Q2OWE2ZWQ3ZDVhYzAwIn0=, eyJpdiI6ImIxQ3hSazJZU01nYmRTVURjMVBFY2c9PSIsInZhbHVlIjoiQ3ZpS2JzcnRJNDNIRUpKV2hEZ2VBQT09IiwibWFjIjoiYjgzZDk1Zjk3ZWFjMGZmNWYyZmZhMWVmZGRlY2Q5MDRhODNmYTBiMTdkM2ZhZjc0YTY1MGM3NTEyZjliODAyNCJ9, eyJpdiI6Ik9RMFgzTG5mXC82aVlEVnZGYkpRMEtnPT0iLCJ2YWx1ZSI6IllBNFpVXC9QbDFqTlwvR0dkcnd5ek9uQT09IiwibWFjIjoiODE1MmZjNGM4OTQ3ZjdlNjk1OGZlODdhNDdhMDg4NGNjODg4MzA5ZmZiMWFlZDA3NzIyYmE3YTM4NzdkYjk4NiJ9, eyJpdiI6IkN5NUhUVEhzZ01HaGM4cmkwdmpNeUE9PSIsInZhbHVlIjoicDlVQ3NtcGZ6Ykt2TDJVWWtqVkN4dz09IiwibWFjIjoiNWNmMDBhNzc5MmJlMjlhMzViYzdhNWNhNzViOGUwMDhjMmJjY2U5ZmIwNDBiZTA0N2NjMWI5MzljYjllZDk4MyJ9, eyJpdiI6IlpVU0xjWEtIUTc1Y3kyUlwva1VBWEh3PT0iLCJ2YWx1ZSI6IkcyM2RJVHRiM3kzZ0hORGxmSVduemc9PSIsIm1hYyI6Ijc1NmI2ZDI5ZTcwZDM1NmEyYzM1YmVjMDk2NWYwOTJkZWI0MTc5MmI1Njg2ZGQzMjc3Y2M4ZjlmZWVmNWE3ZGIifQ==, eyJpdiI6Iml6TGJ3YlF3RThYc01cLytvZUFZa013PT0iLCJ2YWx1ZSI6ImtkTVl5Y0lnQkdXZzlwa0xPZ2V5a1E9PSIsIm1hYyI6IjM3MGZkZjk2YzJiNmFmZWJhODA5Nzc0N2Q2OWNhYjY2YTUxMmE1NThjZTAzNzIzZWI2NTk1MGE0ODM2NTEwN2IifQ==, eyJpdiI6IkQySEZjS1BmZld1OHhQcTJxUEtkQWc9PSIsInZhbHVlIjoieGtMcWhYalBJVlBjYVc2XC9OZWpLTkE9PSIsIm1hYyI6IjMwODA2N2Y1Nzc3ZDM1MWM3MzM1OGJlNzNjMDUwM2E2NDEwYWZjOWZkZTU3MDkwMGZlZDdhMWMxODhhYmFhYzcifQ==, 2020-04-05 13:32:26, 2020-04-05 13:32:26))

This will expose all my DB fields and the query itself. I want a simple message like:

SQLSTATE[HY000]: General error: 1364

I tried to use getCode but this will display only "HY000" that is a general database error message, not giving any hint on what the problem could be.

How can I get the message I want?

Furthermore, using Debugbar, I see that when saveOrFail throws an exception, it will throw boht PDOException and QueryException. Is this correct?

Thank you.

Federico Arona
  • 125
  • 1
  • 13

1 Answers1

0

I hope it helps

if ($exception instanceof \PDOException && Str::contains($exception->getMessage(), '(SQL:')) {
    dd(Str::before($exception->getMessage(), '(SQL:'));
}

Printed SQLSTATE[HY000]: General error: 1364 Field 'name' doesn't have a default value for me

AH.Pooladvand
  • 1,944
  • 2
  • 12
  • 26
  • Thank you for your answer! It helped. I wonder if there is a way to access the error code 1364 as exception member. By they way it solved my question for now. I'm accepting your answer as is the most useful for now. Thank you again. – Federico Arona Apr 05 '20 at 14:08
  • This was exactly what I was searching for. Thank you very much again! – Federico Arona Apr 05 '20 at 14:25