English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Neste tutorial, você aprenderá a usar as funcionalidades de tratamento de erros do PHP para lidar elegantemente com situações de erro.
Às vezes, sua aplicação pode não funcionar corretamente, resultando em erros. Existem vários motivos que podem causar erros, como:
O servidor web pode estar sem espaço em disco
O usuário pode ter inserido valores inválidos em campos de formulário
O arquivo ou registro de banco de dados que você tentou acessar pode não existir
A aplicação pode não ter permissão para escrever arquivos no disco
Os serviços que a aplicação precisa acessar podem estar temporariamente indisponíveis
Esses tipos de erros são chamados de erros de tempo de execução porque ocorrem durante a execução do script. Eles são diferentes dos erros de sintaxe que precisam ser corrigidos antes da execução do script.
Aplicações profissionais devem ter funções apropriadas para lidar com esses erros de tempo de execução. Isso geralmente significa informar claramente e de forma precisa o usuário sobre o que aconteceu.
Normalmente, quando há um problema que impede o funcionamento normal do script, o motor PHP aciona um erro. Cada erro é representado por um valor inteiro e uma constante associada. A tabela a seguir lista alguns níveis de erro comuns:
Nível de erro | Valor | Descrição |
---|---|---|
E_ERROR | 1 | Erro de tempo de execução fatal, impossível de recuperar. A execução do script será imediatamente interrompida. |
E_WARNING | 2 | Aviso de tempo de execução. Não é fatal, a maioria dos erros pertence a essa categoria. A execução do script não será interrompida. |
E_NOTICE | 8 | Notificação de tempo de execução. Indica que o script encontrou uma situação que pode resultar em erro, mesmo que isso possa ocorrer durante a execução normal do script. |
E_USER_ERROR | 256 | Mensagens de erro fatais geradas pelo usuário. Isso é semelhante a E_ERROR, mas é gerado pelo script PHP usando a função trigger_error() em vez do motor PHP. |
E_USER_WARNING | 512 | Avisos gerados pelo usuário não fatais. Isso é semelhante a E_WARNING, mas é gerado pelo script PHP usando a função trigger_error() em vez do motor PHP. |
E_USER_NOTICE | 1024 | Mensagem de notificação gerada pelo usuário. Isso é semelhante a E_NOTICE, mas é gerado pelo script PHP usando a função trigger_error() em vez do motor PHP. |
E_STRICT | 2048 | Em termos estritos, não é um erro, mas o PHP aciona sempre que encontrar código que pode causar problemas ou incompatibilidade para frente |
E_ALL | 8191 | Todos os erros e avisos, PHP 5.4.0 antes de E_STRICT. |
Para mais níveis de erro, consulteNíveis de erro PHPda referência.
Cada vez que um script PHP encontrar um problema, o motor PHP dispara um erro, mas você também pode disparar um erro você mesmo para gerar mensagens de erro mais amigáveis para o usuário. Dessa forma, você pode tornar a aplicação mais complexa. A seguir, estão descritos alguns métodos comuns usados para lidar com erros PHP:
Considere o seguinte exemplo, que tenta abrir um arquivo de texto em modo de leitura.
<?php //Tentativa de abrir arquivo inexistente $file = fopen("sample.txt", "r"); ?>
Se o arquivo não existir, você pode receber o seguinte erro:
Aviso: fopen(sample.txt) [função.fopen]: falha ao abrir o fluxo: Nenhum arquivo ou diretório no C:\wamp\www\project\test.php na linha 2
Seguindo algumas etapas simples, podemos evitar que o usuário receba este tipo de mensagem de erro.
<?php if(file_exists("sample.txt")){ $file = fopen("sample.txt", "r"); } else { die("Erro: O arquivo que você está tentando acessar não existe."); } ?>
Agora, se você executar o script acima, você receberá a seguinte mensagem de erro:
Erro: O arquivo que você está tentando acessar não existe.
Como você pode ver, ao implementar uma simples verificação de existência do arquivo antes de tentar acessá-lo, podemos gerar mensagens de erro mais significativas para o usuário.
Se o arquivo "sample.txt" não for encontrado, a função die() usada acima exibirá apenas a mensagem de erro personalizada e interromperá o script atual.
Você pode criar sua própria função de tratamento de erro para lidar com erros de tempo de execução gerados pelo motor PHP. O programa de tratamento de erro personalizado oferece maior flexibilidade e melhor controle sobre os erros, pode verificar os erros e decidir como lidar com eles, pode exibir uma mensagem para o usuário, registrar o erro em um arquivo ou banco de dados ou enviar por e-mail, tentar corrigir o problema e continuar, sair da execução do script ou ignorar completamente o erro.
A função de tratamento de erro personalizada deve ser capaz de lidar com pelo menos dois parâmetros (errno e errstr), mas pode optar por aceitar outros três parâmetros (errfile, errline e errcontext), conforme descrito abaixo:
Parâmetros | Descrição |
---|---|
Necessário - Os seguintes parâmetros são necessários | |
errno | Especifique o nível de erro como um inteiro. Isso corresponde aos constantes de nível de erro apropriados (E_ERROR, E_WARNING, etc.) |
errstr | Especifique a mensagem de erro como uma string |
Opcional - Os seguintes parâmetros são opcionais | |
errfile | Especifique o nome do arquivo do script onde o erro ocorreu como uma string |
errline | Especifique o número da linha onde o erro ocorreu como uma string |
errcontext | Especifique um array contendo todas as variáveis existentes no momento do erro e seus valores. Útil para depuração |
A seguir está um exemplo simples de função de tratamento de erro personalizada. independentemente de quão insignificante, sempre que ocorrer um erro, este tratador customError() é acionado. Em seguida, os detalhes do erro são exibidos no navegador e a execução do script é interrompida.
<?php //Função de tratamento de erros function customError($errno, $errstr){ echo "<b>Error:</b> [$errno] $errstr"; } ?>
Você precisa informar o PHP para usar sua função de tratamento de erro personalizada-Basta chamar a função integrada set_error_handler() e passar o nome da função.
<?php //Função de tratamento de erros function customError($errno, $errstr){ echo "<b>Error:</b> [$errno] $errstr"; } //Definir gerenciador de erros set_error_handler("customError"); //Gerar erro echo($test); ?>
Você também pode registrar os detalhes do erro em um arquivo de log, conforme exemplo a seguir:
<?php function calcDivision($dividend, $divisor) { if($divisor == 0) { trigger_error("calcDivision(): O divisor não pode ser zero", E_USER_WARNING); return false; } else { return($dividend / $divisor); } } function customError($errno, $errstr, $errfile, $errline, $errcontext){ $message = date("Y-m-d H:i:s - "); $message = "Erro: [" . $errno . "] - ". "$errstr em $errfile na linha $errline;" $message .= "Variáveis: " . print_r($errcontext, true) . "\r\n"; error_log($message, 3, "logs"/app_errors.log); die("Ocorreu um problema, por favor, tente novamente."); } set_error_handler("customError"); echo calcDivision(10, 0); echo "Este nunca será impresso."; ?>
Você também pode usar a função error_log() para enviar e-mails com detalhes de erro.
<?php function calcDivision($dividend, $divisor) { if ($divisor == 0){ trigger_error("calcDivision(): O divisor não pode ser zero", E_USER_WARNING); return false; } else { return($dividend / $divisor); } } function customError($errno, $errstr, $errfile, $errline, $errcontext){ $message = date("Y-m-d H:i:s - "); $message = "Erro: [" . $errno . "] - ". "$errstr em $errfile na linha $errline;" $message .= "Variáveis: " . print_r($errcontext, true) . "\r\n"; error_log($message, 1, "[email protected]"); die("Ocorreu um problema, por favor, tente novamente. O relatório de erro foi enviado ao administrador do site."); } set_error_handler("customError"); echo calcDivision(10, 0); echo "Isso nunca será impresso."; ?>
Embora o motor PHP dispare erros ao encontrar problemas no script, você também pode gerar erros manualmente. Isso pode ajudar a tornar seu aplicativo mais robusto, pois pode marcar possíveis problemas antes que eles se tornem erros graves.
Para gerar um erro dentro do script, chame a função trigger_error() e passe a mensagem de erro a ser gerada:
trigger_error("Ocorreu um problema.");
Considere a função a seguir para calcular a divisão de dois números.
<?php function calcDivision($dividend, $divisor) { return($dividend / $divisor); } //chamada de função echo calcDivision(10, 0); ?>
Se passar um valor zero como parâmetro $divisor, o erro gerado pelo motor PHP será semelhante ao seguinte conteúdo:
Aviso: Divisão por zero em C:\wamp\www\project\test.php na linha 3
Esta mensagem parece não ter muito conteúdo. Veja o exemplo a seguir de geração de erro usando a função trigger_error().
<?php function calcDivision($dividend, $divisor) { if($divisor == 0) { trigger_error("O divisor não pode ser zero", E_USER_WARNING); return false; } else { return($dividend / $divisor); } } //chamada de função echo calcDivision(10, 0); ?>
Agora, o script gera esta mensagem de erro:
Aviso: O divisor não pode ser zero em C:\wamp\www\project\error.php na linha 4
Como você vê, a mensagem de erro gerada pelo segundo exemplo é mais clara sobre o problema em comparação com o exemplo anterior.