Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

@ error suppression operator and set_error_handler

Tags:

I am following good programming practices and I am logging the PHP errors to file instead of displaying it to user. I use set_error_handler() for that.

Now the problem. For example, I have somewhere:

@file_exists('/some/file/that/is/outside/openbasedir.txt'); 

But despite the error suppression operator, the error message logs. I don't want that. I want suppressed errors not to pass to my error handler.

like image 850
Rok Kralj Avatar asked Sep 11 '11 19:09

Rok Kralj


2 Answers

The @ operator temporarily sets error_reporting to 0, so you can test the value of error_reporting in your error handler:

if (ini_get('error_reporting') == 0) {     return; } 

Or even better, log only error types that are in error_reporting:

$error_reporting = ini_get('error_reporting');  if ( !($error_reporting & $errno) ) {     return; } 

Also take a look at the log_errors and error_log options, for automatically logging errors to a file or to syslog.

like image 158
Arnaud Le Blanc Avatar answered Sep 22 '22 06:09

Arnaud Le Blanc


Solution that also works for PHP 7

According to the PHP docs:

If you have set a custom error handler function with set_error_handler() then it will still get called, but this custom error handler can (and should) call error_reporting() which will return 0 when the call that triggered the error was preceded by an @.

Source: http://php.net/manual/en/language.operators.errorcontrol.php

So you can use the following code in your error handler:

function exception_error_handler($errno, $errstr, $errfile, $errline ) {     if (error_reporting() == 0) {         /// @ sign temporary disabled error reporting         return;     }      throw new ErrorException($errstr, 0, $errno, $errfile, $errline); }  set_error_handler("exception_error_handler"); 
like image 26
Simon Backx Avatar answered Sep 18 '22 06:09

Simon Backx