As this answer suggests, you can use register_shutdown_function()
to register a callback that'll check error_get_last()
.
You'll still have to manage the output generated from the offending code, whether by the @
(shut up) operator, or ini_set('display_errors', false)
ini_set('display_errors', false);
error_reporting(-1);
set_error_handler(function($code, $string, $file, $line){
throw new ErrorException($string, null, $code, $file, $line);
});
register_shutdown_function(function(){
$error = error_get_last();
if(null !== $error)
{
echo 'Caught at shutdown';
}
});
try
{
while(true)
{
$data .= str_repeat('#', PHP_INT_MAX);
}
}
catch(\Exception $exception)
{
echo 'Caught in try/catch';
}
When run, this outputs Caught at shutdown
. Unfortunately, the ErrorException
exception object isn't thrown because the fatal error triggers script termination, subsequently caught only in the shutdown function.
You can check the $error
array in the shutdown function for details on the cause, and respond accordingly. One suggestion could be reissuing the request back against your web application (at a different address, or with different parameters of course) and return the captured response.
I recommend keeping error_reporting()
high (a value of -1
) though, and using (as others have suggested) error handling for everything else with set_error_handler()
and ErrorException
.