View Issue Details

IDProjectCategoryView StatusLast Update
0002276XdebugStep Debuggingpublic2024-08-07 15:22
Reportertefxacn Assigned Toderick  
PrioritynormalSeveritymajorReproducibilityalways
Status resolvedResolutionno change required 
Product Version3.3.2 
Summary0002276: Custom error handler return true will stop Exception handlers from breaking - returning false will write to PHP error log though
Description

When using a custom error handler, I can return true; to avoid it bubbling up to PHP's native error handler (or any system defined handlers for that matter)*
This will obviously prevent xdebug breaking on the exception (assuming there is a PHP Exception breakpoint set up)

Therefore, one must return false to make xdebug work - that's fine.
The problem though is, that this (xdebug) will then bubble it up to the native PHP error handler and the error ends up in the PHP error log specified.

There needs to be a way to tell xdebug to NOT bubble up the error to PHP's native error handler, to prevent errors ending up in the error log.

e.g. xdebug_disable_next_error_bubble(); to skip bubbling of the next or xdebug_disable_error_bubble(); to disable it altogether; or possible a ini setting?

*see https://www.php.net/manual/en/function.set-error-handler.php#:~:text=It%20is%20important%20to%20remember%20that%20the%20standard%20PHP%20error%20handler%20is%20completely%20bypassed%20for%20the%20error%20types%20specified%20by%20error_levels%20unless%20the%20callback%20function%20returns%20false

Steps To Reproduce
function log_error($type, $message, $file, $line) {
     // ...
     return true;
}
set_error_handler( 'log_error' );

$x = [15.7 => 'a'];

Will not break (and not report the error anywhere in this simplified example)
Change to return false; and it will break and also output the error to PHP error log

Additional Information

Possible solution:

function log_error($type, $message, $file, $line) {
     // ...
     if ( function_exists( 'xdebug_is_debugger_active' ) && xdebug_is_debugger_active() ) {
          xdebug_disable_next_error_bubble();
          return false;
     }

     return true;
}
set_error_handler( 'log_error' );

$x = [15.7 => 'a'];

It will break at the error but not bubble the error to the PHP native error handler (bc xdebug itself will "return true;" basically)

TagsNo tags attached.
Operating System
PHP Version8.2.0-8.2.9

Activities

tefxacn

2024-07-07 11:04

reporter   ~0006983

Worked around it by just doing:

     if ( function_exists( 'xdebug_is_debugger_active' ) && xdebug_is_debugger_active() ) {
          xdebug_break();
     }

in log_error

derick

2024-08-07 15:22

administrator   ~0007041

Hi,

I don't think there is a bug here. By using set error handler, you are turning off normal error handling, and substituting your own. This is as you indicate, also documented. Xdebug's error handler will therefore also correctly not run. Your workaround is the correct way of handling this.

However, when you say Custom error handler return true will stop Exception handlers from breaking I am a little confused, as the error handler has nothing to do with exceptions. There is a different function for that (set_exception_handler) which doesn't have the return true/false semantics.

cheers,
Derick

Issue History

Date Modified Username Field Change
2024-06-18 10:10 tefxacn New Issue
2024-07-07 11:04 tefxacn Note Added: 0006983
2024-08-07 15:22 derick Assigned To => derick
2024-08-07 15:22 derick Status new => resolved
2024-08-07 15:22 derick Resolution open => fixed
2024-08-07 15:22 derick Note Added: 0007041
2024-08-07 15:22 derick Resolution fixed => no change required