International PHP Conference Berlin 2025

restore_error_handler

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

restore_error_handlerRecupera la función de gestión de errores previa

Descripción

restore_error_handler(): true

Usada después de modificar la función de gestión de errores usando set_error_handler(), para revertir al gestor de errores previo (el cual puede ser el incorporado o una función definida por el usuario).

Parámetros

Esta función no tiene parámetros.

Valores devueltos

Siempre devuelve true.

Ejemplos

Ejemplo #1 Ejemplo de restore_error_handler()

Decidir si unserialize() causó un error, entonces recuperar el gestor de errores original.

<?php
function gestor_unserialize($errno, $errstr)
{
echo
"Valor seriado inválido.\n";
}

$seriado = 'foo';
set_error_handler('gestor_unserialize');
$original = unserialize($seriado);
restore_error_handler();
?>

El resultado del ejemplo sería:

Valor seriado inválido.

Ver también

add a note

User Contributed Notes 4 notes

up
28
edgarinvillegas at hotmail dot com
16 years ago
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)
?>
up
0
masterada at gmail dot com
7 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
up
0
lsole at maresme dot net
20 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!
up
-2
TiMESPLiNTER
9 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');

?>
To Top