Calling a method on null used to end the request with a fatal that no handler could intercept, which is why every framework had a register_shutdown_function checking error_get_last(). Most of those are now genuine exceptions.
try {
$order->total(); // $order is null
} catch (Error $e) {
Log::critical($e->getMessage(), ['trace' => $e->getTraceAsString()]);
throw $e;
}
The practical gain is the stack trace: a fatal gave a file and a line, an Error gives the whole call path, which is usually the difference between a five-minute fix and an afternoon. Keep the shutdown handler anyway — memory exhaustion and a few parse-time failures are still not catchable, and those are exactly the ones you most want reported.