MFH: User error handlers no longer catch supressed errors

This commit is contained in:
Etienne Kneuss 2008-03-08 22:12:32 +00:00
parent fd0d44f0a7
commit e9a6f0f24a
4 changed files with 40 additions and 22 deletions

View File

@ -0,0 +1,26 @@
--TEST--
user defined error handler + set_error_handling(EH_THROW)
--SKIPIF--
<?php if (!extension_loaded("spl") || is_dir('/this/path/does/not/exist')) die("skip"); ?>
--FILE--
<?php
$dir = '/this/path/does/not/exist';
set_error_handler('my_error_handler');
function my_error_handler() {$a = func_get_args(); print "in error handler\n"; }
try {
print "before\n";
$iter = new DirectoryIterator($dir);
print get_class($iter) . "\n";
print "after\n";
} catch (Exception $e) {
print "in catch: ".$e->getMessage()."\n";
}
?>
==DONE==
<?php exit(0); ?>
--EXPECT--
before
in catch: DirectoryIterator::__construct(/this/path/does/not/exist): failed to open dir: No such file or directory
==DONE==

View File

@ -778,17 +778,15 @@ PHPAPI void php_html_puts(const char *str, uint size TSRMLS_DC)
/* {{{ php_suppress_errors */ /* {{{ php_suppress_errors */
PHPAPI void php_set_error_handling(error_handling_t error_handling, zend_class_entry *exception_class TSRMLS_DC) PHPAPI void php_set_error_handling(error_handling_t error_handling, zend_class_entry *exception_class TSRMLS_DC)
{ {
PG(error_handling) = error_handling; EG(error_handling) = error_handling;
PG(exception_class) = exception_class; EG(exception_class) = exception_class;
if (PG(last_error_message)) {
free(PG(last_error_message)); if (error_handling == EH_NORMAL) {
PG(last_error_message) = NULL; EG(user_error_handler) = EG(user_error_handler_old);
} else {
EG(user_error_handler_old) = EG(user_error_handler);
EG(user_error_handler) = NULL;
} }
if (PG(last_error_file)) {
free(PG(last_error_file));
PG(last_error_file) = NULL;
}
PG(last_error_lineno) = 0;
} }
/* }}} */ /* }}} */
@ -833,7 +831,7 @@ static void php_error_cb(int type, const char *error_filename, const uint error_
} }
/* according to error handling mode, suppress error, throw exception or show it */ /* according to error handling mode, suppress error, throw exception or show it */
if (PG(error_handling) != EH_NORMAL) { if (EG(error_handling) != EH_NORMAL) {
switch (type) { switch (type) {
case E_ERROR: case E_ERROR:
case E_CORE_ERROR: case E_CORE_ERROR:
@ -854,8 +852,8 @@ static void php_error_cb(int type, const char *error_filename, const uint error_
/* throw an exception if we are in EH_THROW mode /* throw an exception if we are in EH_THROW mode
* but DO NOT overwrite a pending exception * but DO NOT overwrite a pending exception
*/ */
if (PG(error_handling) == EH_THROW && !EG(exception)) { if (EG(error_handling) == EH_THROW && !EG(exception)) {
zend_throw_error_exception(PG(exception_class), buffer, 0, type TSRMLS_CC); zend_throw_error_exception(EG(exception_class), buffer, 0, type TSRMLS_CC);
} }
efree(buffer); efree(buffer);
return; return;
@ -1729,7 +1727,8 @@ int php_module_startup(sapi_module_struct *sf, zend_module_entry *additional_mod
PG(last_error_message) = NULL; PG(last_error_message) = NULL;
PG(last_error_file) = NULL; PG(last_error_file) = NULL;
PG(last_error_lineno) = 0; PG(last_error_lineno) = 0;
PG(error_handling) = EH_NORMAL; EG(error_handling) = EH_NORMAL;
EG(exception_class) = NULL;
PG(disable_functions) = NULL; PG(disable_functions) = NULL;
PG(disable_classes) = NULL; PG(disable_classes) = NULL;

View File

@ -278,12 +278,7 @@ int cfgparse(void);
END_EXTERN_C() END_EXTERN_C()
#define php_error zend_error #define php_error zend_error
#define error_handling_t zend_error_handling_t
typedef enum {
EH_NORMAL = 0,
EH_SUPPRESS,
EH_THROW
} error_handling_t;
BEGIN_EXTERN_C() BEGIN_EXTERN_C()
PHPAPI void php_set_error_handling(error_handling_t error_handling, zend_class_entry *exception_class TSRMLS_DC); PHPAPI void php_set_error_handling(error_handling_t error_handling, zend_class_entry *exception_class TSRMLS_DC);

View File

@ -150,8 +150,6 @@ struct _php_core_globals {
char *last_error_message; char *last_error_message;
char *last_error_file; char *last_error_file;
int last_error_lineno; int last_error_lineno;
error_handling_t error_handling;
zend_class_entry *exception_class;
char *disable_functions; char *disable_functions;
char *disable_classes; char *disable_classes;