The 5.5 exception that renders itself

Custom exceptions have always had to be translated into a response somewhere in the handler, which turns one file into a growing chain of instanceof checks. 5.5 lets the exception answer for itself.

class PaymentDeclined extends Exception
{
    public function render($request)
    {
        return $request->expectsJson()
            ? response()->json(['error' => 'declined'], 402)
            : redirect()->route('checkout')->withErrors($this->getMessage());
    }

    public function report(): bool
    {
        return false;   // expected; do not fill the log with it
    }
}

report() returning false is the half that gets overlooked and is often the more valuable: a declined card is a normal outcome, not an incident, and logging it as an exception trains people to ignore the log. Keeping the response next to the exception also means the handler stops being the place every feature has to touch.