set_error_handler
(PHP 4 >= 4.0.1, PHP 5)
set_error_handler --
Define uma função do usuário para manusear os erros.
Descrição
string
set_error_handler ( callback error_handler )
Define uma função do usuário (error_handler) para manusear os
erros no script. Retorna a função definida anteriormente (se houver alguma),
ou FALSE em caso de erro. Esta função pode ser usada para definir o seu próprio
meio de manusear os erros durante a execução do script,
por exemplo em aplicações que você precisa fazer uma limpesa de dados/arquivos quando
um erro crítico acontece, ou quando você quer criar um erro
sobre certas condições (usando
trigger_error()).
A função do usuario precisa aceitar dois parâmetros: o código do erro e a string
descrevendo o erro. Apartir do PHP 4.0.2, três parâmetros opcionais
são fornecidos: o nome do erro onde o arquivo aconteceu, o número
da linha onde o erro aconteceu, e o contexto onde o erro aconteceu
(uma matriz que aponta para a tabela de símbolos ativos no
ponto onde aconteceu o erro).
Nota:
Ao invés de um nome de função, uma matriz contendo uma referência a um objeto
e um nome de metodo pode ser indicado (Apartir do PHP 4.3.0).
Nota:
Os seguintes tipos de erro não podem ser manuseados por uma função definida pelo usuário:
E_ERROR, E_PARSE,
E_CORE_ERROR, E_CORE_WARNING,
E_COMPILE_ERROR e
E_COMPILE_WARNING.
O exemplo abaixo mostra como manusear exceções criando
erros e gerenciando erros com uma função definida pelo usuário:
Exemplo 1.
Manuseando erros com set_error_handler() e
trigger_error()
<?php
// redefine the user error constants - PHP 4 only define("FATAL", E_USER_ERROR); define("ERROR", E_USER_WARNING); define("WARNING", E_USER_NOTICE);
// set the error reporting level for this script error_reporting(FATAL | ERROR | WARNING);
// error handler function function myErrorHandler($errno, $errstr, $errfile, $errline) { switch ($errno) { case FATAL: echo "<b>FATAL</b> [$errno] $errstr<br />\n"; echo " Fatal error in line $errline of file $errfile"; echo ", PHP ".PHP_VERSION." (".PHP_OS.")<br />\n"; echo "Aborting...<br />\n"; exit(1); break; case ERROR: echo "<b>ERROR</b> [$errno] $errstr<br />\n"; break; case WARNING: echo "<b>WARNING</b> [$errno] $errstr<br />\n"; break; default: echo "Unkown error type: [$errno] $errstr<br />\n"; break; } }
// function to test the error handling function scale_by_log($vect, $scale) { if (!is_numeric($scale) || $scale <= 0) { trigger_error("log(x) for x <= 0 is undefined, you used: scale = $scale", FATAL); }
if (!is_array($vect)) { trigger_error("Incorrect input vector, array of values expected", ERROR); return null; }
for ($i=0; $i<count($vect); $i++) { if (!is_numeric($vect[$i])) trigger_error("Value at position $i is not a number, using 0 (zero)", WARNING); $temp[$i] = log($scale) * $vect[$i]; } return $temp; }
// set to the user defined error handler $old_error_handler = set_error_handler("myErrorHandler");
// trigger some errors, first define a mixed array with a non-numeric item echo "vector a\n"; $a = array(2,3, "foo", 5.5, 43.3, 21.11); print_r($a);
// now generate second array, generating a warning echo "----\nvector b - a warning (b = log(PI) * a)\n"; $b = scale_by_log($a, M_PI); print_r($b);
// this is trouble, we pass a string instead of an array echo "----\nvector c - an error\n"; $c = scale_by_log("not array", 2.3); var_dump($c);
// this is a critical error, log of zero or negative number is undefined echo "----\nvector d - fatal error\n"; $d = scale_by_log($a, -2.5);
?>
|
E quando você usar este script de exemplo, a saída será:
vector a
Array
(
[0] => 2
[1] => 3
[2] => foo
[3] => 5.5
[4] => 43.3
[5] => 21.11
)
----
vector b - a warning (b = log(PI) * a)
<b>WARNING</b> [1024] Value at position 2 is not a number, using 0 (zero)<br />
Array
(
[0] => 2.2894597716988
[1] => 3.4341896575482
[2] => 0
[3] => 6.2960143721717
[4] => 49.566804057279
[5] => 24.165247890281
)
----
vector c - an error
<b>ERROR</b> [512] Incorrect input vector, array of values expected<br />
NULL
----
vector d - fatal error
<b>FATAL</b> [256] log(x) for x <= 0 is undefined, you used: scale = -2.5<br />
Fatal error in line 36 of file trigger_error.php, PHP 4.0.2 (Linux)<br />
Aborting...<br /> |
|
É importante lembrar que o gerenciamento de erro do padrão do PHP é completamente
ignorado. As definições de error_reporting() não terão efeito
e seu gerenciador de erro será chamado. Em todo o caso, você ainda poderá
ler o valor atual de error_reporting e
ajir apropriadamente. Uma nota em particular é que este valor será 0 se
o comando que causou o erro for precedido pelo
operador de
controle de erro @.
Note também que é sua responsabilidade usar o die()
se necessário. Se a função que gerencia os erros retornar, a execução do script
irá continuar a apartir do comando seguinte ao que causou o erro
Nota:
Se o erro acontecer antes da execução do script(ex. enquanto o arquivo é carregado)
a função defina pelo usuario não será chamada já que não estará ainda registrada.
Veja também error_reporting(),
restore_error_handler(),
trigger_error() e
constantes de níveis de erro.