No PHP, o tratamento de erros padrão é simples. Uma mensagem de erro é enviada ao navegador com o nome do arquivo, número da linha e uma mensagem descrevendo o erro.
O tratamento de erros é uma parte importante na criação de scripts e aplicativos da Web. Se o seu código não tiver codificação de detecção de erros, o programa parecerá pouco profissional e abrirá a porta para riscos de segurança.
Este tutorial apresenta alguns dos métodos de detecção de erros mais importantes em PHP.
Explicaremos diferentes métodos de tratamento de erros para você:
Declaração simples "die ()"
Erros personalizados e gatilhos de erro
relatório de erros
O primeiro exemplo mostra um script simples que abre um arquivo de texto:
<?php$file=fopen("bem-vindo.txt","r");?>
Se o arquivo não existir, você receberá um erro como este:
Aviso: fopen(welcome.txt) [function.fopen]: falha ao abrir stream:Não existe tal arquivo ou diretório em /www/codercto/test/test.php na linha 2
Para evitar que os usuários recebam mensagens de erro como a acima, verificamos se o arquivo existe antes de acessá-lo:
<?phpif(!file_exists("welcome.txt")){ die("Arquivo não existe");}else{ $file=fopen("welcome.txt","r");}?>
Agora, se o arquivo não existir, você receberá uma mensagem de erro como esta:
O arquivo não existe
O código acima é mais eficiente que o código anterior porque usa um mecanismo simples de tratamento de erros para encerrar o script após um erro.
No entanto, simplesmente encerrar o script nem sempre é apropriado. Vamos examinar funções PHP alternativas para lidar com erros.
Criar um manipulador de erros personalizado é muito simples. Simplesmente criamos uma função dedicada que pode ser chamada quando ocorre um erro no PHP.
A função deve ser capaz de lidar com pelo menos dois parâmetros (nível de erro e mensagem de erro), mas pode aceitar até cinco parâmetros (opcional: arquivo, número de linha e contexto de erro):
função_erro(nível_de_erro,mensagem_de_erro,arquivo_de_erro,linha_de_erro,contexto_de_erro)
parâmetro | descrever |
---|---|
nível_erro | Obrigatório. Especifica o nível de relatório de erros para erros definidos pelo usuário. Deve ser um número. Veja a tabela abaixo: Níveis de relatório de erros. |
mensagem_erro | Obrigatório. Especifica mensagens de erro para erros definidos pelo usuário. |
arquivo_erro | Opcional. Especifica o nome do arquivo onde ocorreu o erro. |
linha_erro | Opcional. Especifica o número da linha onde ocorreu o erro. |
contexto_erro | Opcional. Especifica uma matriz contendo cada variável em uso quando ocorreu o erro e seus valores. |
Esses níveis de relatório de erros são diferentes tipos de erros tratados por manipuladores de erros definidos pelo usuário:
valor | constante | descrever |
---|---|---|
2 | E_WARNING | Erro de tempo de execução não fatal. Não pause a execução do script. |
8 | E_NOTICE | notificações em tempo de execução. Ocorre quando o script encontra um possível erro, mas também pode ocorrer quando o script está sendo executado normalmente. |
256 | E_USER_ERROR | Erro fatal gerado pelo usuário. Isso é semelhante ao E_ERROR definido pelo programador usando a função PHP trigger_error(). |
512 | E_USER_WARNING | Aviso não fatal gerado pelo usuário. Isso é semelhante ao E_WARNING definido pelo programador usando a função PHP trigger_error(). |
1024 | E_USER_NOTICE | Notificações geradas pelo usuário. Isso é semelhante ao E_NOTICE definido pelo programador usando a função PHP trigger_error(). |
4096 | E_RECOVERABLE_ERROR | Erros fatais detectáveis. Como E_ERROR, mas pode ser detectado por manipuladores definidos pelo usuário. (Veja set_error_handler()) |
8191 | E_TODOS | Todos os erros e avisos. (No PHP 5.4, E_STRICT torna-se parte de E_ALL) |
Agora, vamos criar uma função que lide com erros:
function customError($errno, $errstr){ echo "<b>Erro:</b> [$errno] $errstr<br>";
O código acima é uma função simples de tratamento de erros. Quando é acionado, obtém o nível de erro e a mensagem de erro. Em seguida, ele imprime o nível de erro e a mensagem e encerra o script.
Agora que criamos uma função de tratamento de erros, precisamos determinar quando acioná-la.
O manipulador de erros padrão do PHP é o manipulador de erros integrado. Vamos transformar a função acima no manipulador de erros padrão quando o script estiver em execução.
Os manipuladores de erros podem ser modificados para serem aplicados apenas a determinados erros, para que o script possa tratar diferentes erros de maneira diferente. No entanto, neste caso usaremos nosso manipulador de erros personalizado para todos os erros:
set_error_handler("customError");
Como queremos que nossa função personalizada lide com todos os erros, set_error_handler() requer apenas um argumento e um segundo argumento pode ser adicionado para especificar o nível de erro.
Teste este manipulador de erros tentando imprimir uma variável que não existe:
<?php// Função de tratamento de erros function customError($errno, $errstr){ echo "<b>Erro:</b> [$errno] $errstr";}// Definir função de tratamento de erros set_error_handler("customError") ;//Erro de disparo echo($test);?>
A saída do código acima é semelhante a esta:
Erro: [8] Variável indefinida: teste
Quando o usuário insere dados em um script, é útil disparar um erro quando a entrada do usuário é inválida. Em PHP, esta tarefa é realizada pela função trigger_error().
Neste exemplo, se a variável "teste" for maior que "1", ocorre um erro:
<?php$test=2;if ($test>1){ trigger_error("O valor da variável deve ser menor ou igual a 1");}?>
A saída do código acima é semelhante a esta:
Aviso: o valor da variável deve ser menor ou igual a 1in /www/test/codercto.php na linha 5
Você pode acionar um erro em qualquer lugar do script e, ao adicionar um segundo parâmetro, pode especificar o nível de erro acionado.
Possíveis tipos de erros:
E_USER_ERROR – Erro fatal em tempo de execução gerado pelo usuário. O erro não pode ser recuperado. A execução do script foi interrompida.
E_USER_WARNING – Aviso de tempo de execução não fatal gerado pelo usuário. A execução do script não é interrompida.
E_USER_NOTICE - Padrão. Notificações em tempo de execução geradas pelo usuário. Ocorre quando o script encontra um possível erro, mas também pode ocorrer quando o script está sendo executado normalmente.
Neste exemplo, se a variável "test" for maior que "1", ocorre um erro E_USER_WARNING. Se ocorrer E_USER_WARNING, usaremos nosso manipulador de erros personalizado e finalizaremos o script:
<?php// Função de tratamento de erros customError($errno, $errstr){ echo "<b>Erro:</b> [$errno] $errstr<br>"; }//Definir a função de tratamento de erros set_error_handler("customError",E_USER_WARNING);//Acionar erro $test=2;if ($test>1){ trigger_error("O valor da variável deve ser menor ou igual a 1",E_USER_WARNING);}?>
A saída do código acima é semelhante a esta:
Erro: [512] O valor da variável deve ser menor ou igual a 1. Fim do script
Agora que aprendemos como criar nossos próprios erros e como acioná-los, vamos dar uma olhada no registro de erros.
Por padrão, o PHP envia logs de erros para o sistema ou arquivo de log do servidor, dependendo da configuração error_log no php.ini. Usando a função error_log(), você pode enviar registros de erros para um arquivo especificado ou destino remoto.
Enviar uma mensagem de erro para si mesmo por e-mail é uma boa maneira de ser notificado sobre um erro específico.
No exemplo abaixo, caso ocorra algum erro específico, enviaremos um e-mail com uma mensagem de erro e finalizaremos o script:
<?php// Função de tratamento de erros customError($errno, $errstr){ echo "<b>Erro:</b> [$errno] $errstr<br>"; ("Erro: [$errno] $errstr",1, "algué[email protected]","De: [email protected]");}// Defina a função de tratamento de erros set_error_handler("customError",E_USER_WARNING); // Erro de gatilho $test=2;if ($test>1){ trigger_error("O valor da variável deve ser menor ou igual a 1",E_USER_WARNING);} ?>
A saída do código acima é semelhante a esta:
Erro: [512] O valor da variável deve ser menor ou igual a 1. O administrador do site foi notificado
O e-mail recebido do código acima é assim:
Erro: [512] O valor da variável deve ser menor ou igual a 1
Este método não é adequado para todos os erros. Erros gerais devem ser registrados no servidor usando o sistema de registro PHP padrão.