Isolde is kind of wrong. The error handlers are stacked with set_error_handler(), and popped with restore_error_handler(). Here i put an example:
<?php
mysql_connect("inexistent"); //Generate an error. The actual error handler is set by default
function foo1() {echo "<br>Error foo1<br>";}
function foo2() {echo "<br>Error foo2<br>";}
function foo3() {echo "<br>Error foo3<br>";}
set_error_handler("foo1"); //current error handler: foo1
set_error_handler("foo2"); //current error handler: foo2
set_error_handler("foo3"); //current error handler: foo3
mysql_connect("inexistent");
restore_error_handler(); //now, current error handler: foo2
mysql_connect("inexistent");
restore_error_handler(); //now, current error handler: foo1
mysql_connect("inexistent");
restore_error_handler(); //now current error handler: default handler
mysql_connect("inexistent");
restore_error_handler(); //now current error handler: default handler (The stack can't pop more)
?>| CARVIEW |
Select Language
HTTP/2 301
server: myracloud
date: Tue, 30 Dec 2025 02:15:30 GMT
content-type: text/html
content-length: 161
location: https://www.php.net/restore_error_handler
HTTP/2 200
server: myracloud
date: Tue, 30 Dec 2025 02:15:31 GMT
content-type: text/html; charset=utf-8
content-language: en
permissions-policy: interest-cohort=()
x-frame-options: SAMEORIGIN
status: 200 OK
link: ; rel=shorturl
last-modified: Tue, 30 Dec 2025 02:08:02 GMT
vary: accept-encoding
content-encoding: gzip
expires: Tue, 30 Dec 2025 02:15:31 GMT
cache-control: max-age=0
PHP: restore_error_handler - Manual
update page now
restore_error_handler
(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)
restore_error_handler — Restores the previous error handler function
Description
restore_error_handler(): true
Used after changing the error handler function using set_error_handler(), to revert to the previous error handler (which could be the built-in or a user defined function).
Parameters
This function has no parameters.
Return Values
Always returns true.
Examples
Example #1 restore_error_handler() example
Decide if unserialize() caused an error, then restore the original error handler.
<?php
function unserialize_handler($errno, $errstr)
{
echo "Invalid serialized value.\n";
}
$serialized = 'foo';
set_error_handler('unserialize_handler');
$original = unserialize($serialized);
restore_error_handler();
?>The above example will output:
Invalid serialized value.
See Also
- error_reporting() - Sets which PHP errors are reported
- set_error_handler() - Sets a user-defined error handler function
- get_error_handler() - Gets the user-defined error handler function
- restore_exception_handler() - Restores the previously defined exception handler function
- trigger_error() - Generates a user-level error/warning/notice message
+add a note
User Contributed Notes 4 notes
edgarinvillegas at hotmail dot com ¶
17 years ago
lsole at maresme dot net ¶
21 years ago
As the docs say, restore_error_handler() revert to the *previous error handler*... even if it is the same. A bug made me set twice my custom error handler and later when I was calling restore_error_handler() to restore the built-in handler nothing seemed to happen... this puzzled me for a while!
masterada at gmail dot com ¶
8 years ago
Calling restore_error_handler from within an error handler might result in unexpected behaviour:
<?php
error_reporting(0);
set_error_handler('handleError1');
trigger_error('1-stack:h1');
set_error_handler('handleError2');
trigger_error('2-stack:h1,h2');
trigger_error('6-stack:h1,h2');
trigger_error('7-stack:h1,h2');
function handleError1($code, $message, $file = '', $line = 0, $context = array())
{
echo __METHOD__ . ' ' . $message . PHP_EOL;
}
function handleError2($code, $message, $file = '', $line = 0, $context = array())
{
trigger_error('3-DEFAULT'); // This will use the php's default error handler
echo __METHOD__ . ' ' . $message . PHP_EOL;
set_error_handler('handleError3');
trigger_error('4-stack:h1,h2,h3');
restore_error_handler(); // This will restore the handleError1 instead of the default error handler
trigger_error('5-DEFAULT');
}
function handleError3($code, $message, $file = '', $line = 0, $context = array())
{
echo __METHOD__ . ' ' . $message . PHP_EOL;
}
?>
The above code will output:
handleError1 1-stack:h1
handleError2 2-stack:h1,h2
handleError3 4-stack:h1,h2,h3
handleError1 5-DEFAULT
handleError1 6-stack:h1,h2
handleError1 7-stack:h1,h2
The following workaround can be used:
<?php
error_reporting(0);
set_error_handler('handleError1');
trigger_error('1-stack:h1');
set_error_handler('handleError2');
trigger_error('2-stack:h1,h2');
trigger_error('6-stack:h1,h2');
trigger_error('7-stack:h1,h2');
function handleError1($code, $message, $file = '', $line = 0, $context = array())
{
echo __METHOD__ . ' ' . $message . PHP_EOL;
}
function handleError2($code, $message, $file = '', $line = 0, $context = [])
{
restore_error_handler(); // This will restore the previous error handler
set_error_handler('count', 0); // Set a dummy method for error handling, it will never be called because $error_type = 0
try
{
trigger_error('3-DEFAULT');
echo __METHOD__ . ' ' . $message . PHP_EOL;
set_error_handler('handleError3');
trigger_error('4-stack:h1,h2,h3');
restore_error_handler();
trigger_error('5-DEFAULT');
}
finally
{
restore_error_handler(); // Restore the previous error handler
set_error_handler('handleError2'); // Set the current error handler again
}
}
function handleError3($code, $message, $file = '', $line = 0, $context = [])
{
echo __METHOD__ . ' ' . $message . PHP_EOL;
}
?>
which will output:
handleError1 1-stack:h1
handleError2 2-stack:h1,h2
handleError3 4-stack:h1,h2,h3
handleError2 6-stack:h1,h2
handleError3 4-stack:h1,h2,h3
handleError2 7-stack:h1,h2
handleError3 4-stack:h1,h2,h3
TiMESPLiNTER ¶
10 years ago
Works also for restoring nested error handlers:
<?php
error_reporting(E_ALL);
echo '<pre>';
set_error_handler(function($errno, $errstr, $errfile, $errline, array $errcontext) {
echo 'ErrorHandler 1: ' , $errstr , PHP_EOL;
});
trigger_error('Error 1');
set_error_handler(function($errno, $errstr, $errfile, $errline, array $errcontext) {
echo 'ErrorHandler 2: ' , $errstr , PHP_EOL;
});
trigger_error('Error 2');
restore_error_handler();
trigger_error('Error 3');
restore_error_handler();
trigger_error('Error 4');
?>
↑ and ↓ to navigate •
Enter to select •
Esc to close • / to open
Press Enter without
selection to search using Google