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.

参见

添加注释

用户贡献的注释 4 notes

edgarinvillegas at hotmail dot com
16 年前
Isolde 有点不对。错误处理程序使用 set_error_handler() 进行堆叠,并使用 restore_error_handler() 弹出。这里我举一个例子

<?php
mysql_connect
("inexistent"); //生成错误。默认情况下设置实际的错误处理程序

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"); //当前错误处理程序:foo1
set_error_handler("foo2"); //当前错误处理程序:foo2
set_error_handler("foo3"); //当前错误处理程序:foo3

mysql_connect("inexistent");
restore_error_handler(); //现在,当前错误处理程序:foo2
mysql_connect("inexistent");
restore_error_handler(); //现在,当前错误处理程序:foo1
mysql_connect("inexistent");
restore_error_handler(); //现在当前错误处理程序:默认处理程序
mysql_connect("inexistent");
restore_error_handler(); //现在当前错误处理程序:默认处理程序(堆栈无法再弹出)
?>
masterada at gmail dot com
7 年前
在错误处理程序中调用 restore_error_handler 可能会导致意外的行为

<?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'); // 这将使用 php 的默认错误处理程序

echo __METHOD__ . ' ' . $message . PHP_EOL;

set_error_handler('handleError3');
trigger_error('4-stack:h1,h2,h3');

restore_error_handler(); // 这将恢复 handleError1 而不是默认的错误处理程序
trigger_error('5-DEFAULT');
}

function
handleError3($code, $message, $file = '', $line = 0, $context = array())
{
echo
__METHOD__ . ' ' . $message . PHP_EOL;
}

?>

上面的代码将输出

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

可以使用以下解决方法

<?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;
}
?>

这将输出

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
lsole at maresme dot net
20 年前
如文档所说,restore_error_handler() 会恢复到 *之前的错误处理程序*... 即使它相同。一个错误让我两次设置了我的自定义错误处理程序,后来当我调用 restore_error_handler() 来恢复内置处理程序时,似乎什么也没发生... 这让我困惑了一会儿!
TiMESPLiNTER
9 年前
也适用于恢复嵌套的错误处理程序

<?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