PHP Try Catch Exemplo: Tutorial de tratamento de exceções e erros

O que é uma exceção?

Um erro é um resultado inesperado do programa que não pode ser tratado pelo próprio programa.

Os erros são resolvidos corrigindo o programa. Um exemplo de erro seria um loop infinito que nunca para de ser executado.

Uma exceção é o resultado inesperado do programa que pode ser tratado pelo próprio programa.

Exemplos de exceção incluem a tentativa de abrir um arquivo que não existe.

Essa exceção pode ser tratada criando o arquivo ou apresentando ao usuário a opção de pesquisar o arquivo.

Por que lidar com exceção?

  • Evite resultados inesperados em nossas páginas que podem ser muito irritantes ou irritantes para nossos usuários finais
  • Melhorar a segurança de nossos aplicativos, não expondo informações que usuários mal-intencionados possam usar para atacar nossos aplicativos
  • Exceções PHP são usadas para alterar o fluxo normal de um programa se ocorrer algum erro previsível.

Tratamento de erros PHP

Quando ocorre um erro, dependendo das suas definições de configuração, PHP exibe a mensagem de erro no navegador da web com informações relacionadas ao erro ocorrido.

PHP oferece várias maneiras de lidar com erros.

Veremos três (3) métodos comumente usados;

  1. Morrer declarações– a função die combina as funções echo e exit em uma. É muito útil quando queremos gerar uma mensagem e interromper a execução do script quando ocorre um erro.
  2. Manipuladores de erros personalizados – estas são funções definidas pelo usuário que são chamadas sempre que ocorre um erro.
  3. Relatório de erros PHP – a mensagem de erro dependendo das configurações de relatório de erros do PHP. Este método é muito útil em ambiente de desenvolvimento quando você não tem ideia do que causou o erro. As informações exibidas podem ajudá-lo a depurar seu aplicativo.

Exemplos de tratamento de erros

Vejamos agora alguns exemplos simples com rotinas de tratamento de erros.

Suponhamos que desenvolvemos uma aplicação que utiliza arquivos de texto para armazenar dados. Podemos querer verificar a existência do arquivo antes de tentar ler os dados dele.

O código abaixo implementa o exemplo acima.

<?php
$denominator = 0;
echo 2 / $denominator;
?>

Supondo que você salvou o arquivo simple_error.php na pasta phptuts, abra a URL http://localhost/phptuts/simple_error.php

Você obterá os seguintes resultados

Tratamento de erros PHP

Como você pode ver pelos resultados acima, isso faz com que nosso aplicativo pareça pouco profissional e pode ser irritante para o usuário.

Modificaremos o código acima e escreveremos um manipulador de erros para o aplicativo

<?php
$denominator = 0;
if ($denominator != 0) {
    echo 2 / $denominator;
} else {
    echo "cannot divide by zero (0)";
}
?>

Supondo que você salvou o código acima como error_handling.php, abra o URL http://localhost/phptuts/error_handling.php

Identificador de exceção PHP em PHP

Nota: é uma boa prática de segurança exibir uma mensagem como a mostrada acima em vez de mostrar a mensagem como “Arquivo não encontrado”.

Vejamos outro exemplo que usa um manipulador de erros personalizado.

O manipulador de erros personalizado será definido como a função de tratamento de erros padrão do PHP e basicamente exibirá um número de erro e uma mensagem.

O código abaixo ilustra a implementação do exemplo acima

<?php
function my_error_handler($error_no, $error_msg)
{
    echo "Opps, something went wrong:";
    echo "Error number: [$error_no]";
    echo "Error Description: [$error_msg]";
}
set_error_handler("my_error_handler");
echo (5 / 0);
?>

Abra o URL http://localhost/phptuts/custom_error_handler.php você obterá os seguintes resultados

. Tratamento de erros PHP


Como você pode ver no exemplo acima, os manipuladores de erros personalizados são poderosos no sentido de que

  • Eles nos permitem personalizar as mensagens de erro.
  • O manipulador de erros personalizado também pode incluir registro de erros em um arquivo/banco de dados, envio de e-mail ao desenvolvedor, etc.

Vejamos agora o terceiro tipo de tratamento de erros. Estaremos usando a função integrada do PHP função error_reporting. Possui a seguinte sintaxe básica

<?php
error_reporting($reporting_level);
?>

AQUI,

  • “error_reporting” é a função de relatório de erros do PHP
  • “$reporting_level” é opcional e pode ser usado para definir o nível de relatório. Se nenhum nível de relatório tiver sido especificado, o PHP usará o nível de relatório de erros padrão conforme especificado no arquivo php.ini.
Nível de relatório Descrição Exemplo
E_WARNING Exibe apenas mensagens de aviso. Não interrompe a execução do script relatório_erro(E_WARNING);
E_NOTICE Exibe avisos que podem ocorrer durante a execução normal de um programa ou que podem ser um erro. relatório_erro(E_AVISO);
E_USER_ERROR Exibe erros gerados pelo usuário, ou seja, manipulador de erros personalizado relatório_erro(E_USER_ERROR);
E_USER_WARNING Exibe mensagens de aviso geradas pelo usuário relatório_erro(E_USER_WARNING);
E_USER_NOTICE Exibe avisos gerados pelo usuário relatório_erro(E_USER_NOTICE);
E_RECOVERABLE_ERROR Exibe erros que não são fatais e podem ser tratados usando manipuladores de erros personalizados relatório_erro(E_RECOVERABLE_ERROR);
E_TODOS Exibe todos os erros e avisos relatório_erro(E_ALL);

Diferença entre erros e exceção

  • As exceções são lançadas e devem ser detectadas, enquanto os erros geralmente são irrecuperáveis.
  • As exceções são tratadas de maneira orientada a objetos. Isso significa quando uma exceção é lançada; é criado um objeto de exceção que contém os detalhes da exceção.

A tabela abaixo mostra os métodos do objeto de exceção

Forma Descrição Exemplo
getMessage () Exibe a mensagem da exceção
<?php
echo $e->getMessage();
?>
Obter código() Exibe o código numérico que representa a exceção
<?php
echo $e->getCode();
?>
getArquivo() Exibe o nome do arquivo e o caminho onde ocorreu a exceção
<?php
echo $e->getFile();
?>
Obter linha() Exibe o número da linha onde ocorreu a exceção
<?php
echo $e->getLine();
?>
getTrace() Exibe uma matriz do backtrace antes da exceção
<?php
print_r( $e->getTrace());
?>
getAnterior() Exibe a exceção anterior antes da atual
<?php
echo $e->getPrevious();
?>
getTraceAsString() Exibe o backtrace da exceção como uma string em vez de um array
<?php
echo $e->getTraceAsString();
?>
__para sequenciar() Exibe toda a exceção como uma string
<?php
echo $e->__toString();
?>


Abaixo está a sintaxe básica para lançar uma exceção.

<?php
throw new Exception("This is an exception example");
?>

AQUI,

  • “throw” é a palavra-chave usada para lançar a exceção
  • “new Exception(…)” cria um objeto de exceção e passa a string “Este é um exemplo de exceção” como o parâmetro da mensagem.

O código acima gera a seguinte mensagem.

Identificador de exceção PHP em PHP

Veremos agora um exemplo que implementa as exceções throw e catch.

Modificaremos o exemplo acima e incluiremos try, throw e catch.

Possui a seguinte sintaxe básica.

<?php
try {
    //code goes here that could potentially throw an exception
}
catch (Exception $e) {
    //exception handling code goes here
}
?>

AQUI,

  • “try{…}” é o bloco de código a ser executado que poderia potencialmente gerar uma exceção
  • “catch(Exception $e){…}” é o bloco de código que captura a exceção lançada e atribui o objeto de exceção à variável $e.

O código abaixo mostra o exemplo básico de exceção com a exceção try, throw e catch implementada.

O programa lança deliberadamente uma exceção que então captura.

<?php
try {
    $var_msg = "This is an exception example";
    throw new Exception($var_msg);
}
catch (Exception $e) {
    echo "Message: " . $e->getMessage();
    echo "";
    echo "getCode(): " . $e->getCode();
    echo "";
    echo "__toString(): " . $e->__toString();
}
?>

Abra o URL http://localhost/phptuts/exception_handling.php Você obterá os seguintes resultados.

Identificador de exceção PHP em PHP

Também é possível criar múltiplas exceções para uma instrução try do php, dependendo do tipo de exceção lançada.

Veja o artigo sobre MySQL, Acesso a dados PHP… para exemplos de implementação de múltiplas exceções

Múltiplas Exceções

Múltiplas exceções usam vários blocos try catch para lidar com as exceções lançadas. Múltiplas exceções são úteis quando;

  • Você deseja exibir uma mensagem personalizada dependendo da exceção lançada
  • Você deseja realizar uma operação exclusiva dependendo da exceção lançada

O fluxograma abaixo ilustra como funcionam múltiplas exceções

Múltiplas Exceções

Vejamos um exemplo que usa múltiplas exceções.

Modificaremos o código que divide um número pelo denominador passado.

Esperamos que ocorram dois tipos de exceções;

  • Divisão por zero
  • Divisão por um número negativo

Para simplificar, exibiremos apenas o tipo de exceção em nossos blocos catch.

A classe Exception incorporada ao PHP é usada para lançar exceções.

Criaremos duas classes que estendem a classe de exceção e as usaremos para lançar exceções.

O código abaixo mostra a implementação.

<?php
class DivideByZeroException extends Exception {};
class DivideByNegativeException extends Exception {};
function process($denominator)
{
	try
	{
		if ($denominator == 0)
		{
			throw new DivideByZeroException();
		}
		else if ($denominator < 0)
		{
			throw new DivideByNegativeException();
		}
		else
		{
			echo 25 / $denominator;
		}
	}
	catch (DivideByZeroException $ex)
	{
		echo "DIVIDE BY ZERO EXCEPTION!";
	}
	catch (DivideByNegativeException $ex)
	{
		echo "DIVIDE BY NEGATIVE NUMBER EXCEPTION!";
	}
	catch (Exception $x)
	{
	echo "UNKNOWN EXCEPTION!";
	}
}
process(0);
?>

Testando o código

Assumiremos que você salvou multiple_exceptions.php na pasta phptuts.

Navegue até o URL http://localhost/phptuts/multiple_exceptions.php

Identificador de exceção PHP em PHP

Volte para o arquivo PHP e passe -1 como parâmetro, conforme mostrado no diagrama a seguir.

Identificador de exceção PHP em PHP

Navegue até o URL http://localhost/phptuts/multiple_exceptions.php.

Que resultados você obtém? Passe 3 como parâmetro.

Que resultados você obtém?

Resumo

  • Erros são resultados inesperados produzidos pelo código PHP
  • O tratamento de erros melhora o desempenho do aplicativo
  • O PHP possui funções integradas que podem ser usadas para personalizar a maneira como o PHP relata erros
  • As exceções são como erros, mas podem ser detectadas usando o bloco catch quando lançadas.
  • Exibir mensagens de erro que mostram informações de erro é considerada uma prática de segurança inadequada.