English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutorial Básico PHP

Tutorial Avançado PHP

PHP & MySQL

Manual de Referência PHP

Tratamento de Erros PHP

Neste tutorial, você aprenderá a usar as funcionalidades de tratamento de erros do PHP para lidar elegantemente com situações de erro.

Tratamento de erros

À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.

Entendendo os níveis de erro

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 erroValorDescrição
E_ERROR1

Erro de tempo de execução fatal, impossível de recuperar. A execução do script será imediatamente interrompida.

E_WARNING2

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_NOTICE8

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_ERROR256

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_WARNING512Avisos 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_NOTICE1024

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_STRICT2048

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_ALL8191

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:

Tratamento básico de erros usando a função die()

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.

Criar um programa de tratamento de erro personalizado

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âmetrosDescrição
Necessário - Os seguintes parâmetros são necessários
errnoEspecifique o nível de erro como um inteiro. Isso corresponde aos constantes de nível de erro apropriados (E_ERROR, E_WARNING, etc.)
errstrEspecifique a mensagem de erro como uma string
Opcional - Os seguintes parâmetros são opcionais
errfileEspecifique o nome do arquivo do script onde o erro ocorreu como uma string
errlineEspecifique o número da linha onde o erro ocorreu como uma string
errcontextEspecifique 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);
?>

Registro de erros

Registrar mensagens de erro em um arquivo de texto

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.";
?>

Enviar mensagens de erro por e-mail

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.";
?>

Gerar erro

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.