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.