restore_error_handler

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

restore_error_handler以前のエラーハンドラ関数を回復する

説明

restore_error_handler(): true

set_error_handler() を使用してエラーハンドラ関数を 変更した後、元のエラーハンドラ(組込またはユーザー定義関数)に戻すために 使用されます。

パラメータ

この関数にはパラメータはありません。

戻り値

常に true を返します。

例1 restore_error_handler() の例

unserialize() がエラーを発生した場合に 元のエラーハンドラに戻すことにする

<?php
function unserialize_handler($errno, $errstr)
{
echo
"Invalid serialized value.\n";
}

$serialized = 'foo';
set_error_handler('unserialize_handler');
$original = unserialize($serialized);
restore_error_handler();
?>

上の例の出力は以下となります。

Invalid serialized value.

参考

add a note

User Contributed Notes 4 notes

up
25
edgarinvillegas at hotmail dot com
17 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
8 years ago
Calling restore_error_handler from within an error handler might result in unexpected behaviour:<?phperror_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:h1handleError2 2-stack:h1,h2handleError3 4-stack:h1,h2,h3handleError1 5-DEFAULThandleError1 6-stack:h1,h2handleError1 7-stack:h1,h2The following workaround can be used:<?phperror_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:h1handleError2 2-stack:h1,h2handleError3 4-stack:h1,h2,h3handleError2 6-stack:h1,h2handleError3 4-stack:h1,h2,h3handleError2 7-stack:h1,h2handleError3 4-stack:h1,h2,h3
up
0
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!
up
-1
TiMESPLiNTER
10 years ago
Works also for restoring nested error handlers:<?phperror_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