PHP Try Catch: criando e tratando exceções

Neste artigo iremos aprender sobre as funções PHP Try Catch. Portanto, teremos os seguinte tópicos:

O PHP Try Catch

As funções Try Catch são funções nativas do PHP. O PHP Try Catch são blocos de comandos que tem como principal objetivo tratar exceções que o programador não tem como prever que irão acontecer ou controlar. Como, por exemplo, erros de execução, ou ainda erros como o usuário perder a conexão com a internet, entre outros. Dessa forma, esses erros e falhas são tratados como exceções, de forma que é possível então compreender ou até manipular o comportamento da aplicação caso aconteça algo inesperado.

Portanto, o bloco PHP try catch serve para que, em um dado momento em que um código possa gerar um erro inesperado, o programador consiga manipular as possibilidades e exceções. Dessa forma, através do Try ele irá tentar executar o código, caso não ocorra nenhum erro, o programa seguirá o seu fluxo normal. Porém, caso aconteça algum erro, ele passa a ser tratado como uma exceção, e dessa forma, utilizará o Catch para poder tratar esse erro.

De certa forma, podemos comparar com o laço de repetição if e else. Porém, o PHP try catch deve ser utilizado quando o desenvolvedor web não tem como garantir que aquele código será executado com sucesso. Ou seja, para tratar os comportamentos inesperados.

Podemos dizer que o bloco Try é um bloco protegido, pois, caso ocorra algum problema, a execução do código será direcionado ao bloco catch correspondente. Dessa forma, se o usuário final realizar algo inadequado, ou houver uma perda de conexão, resultará em um erro e na quebra de execução do programa. Porém, podemos evitar um erro brusco ou queda brusca e tratar o erro como exceção da melhor forma possível.

Criando Exceções

Exceções são usadas para alterar o fluxo normal de um script se ocorrer um erro especificado. Portanto, são essenciais para poder executar um código de PHP Try Catch. Essa condição é chamada de Exception. Quando uma exceção é acionada, normalmente ocorre uma ou mais das seguintes situações:

  • O estado atual do código é salvo;
  • A execução do código mudará para uma função manipuladora de exceção predefinida (personalizada);
  • Dependendo da situação, o manipulador pode retomar a execução a partir do estado de código salvo, finalizar a execução do script ou continuar o script em um local diferente no código.

Porém, é importante que as exceções sejam usadas apenas para condições de erro. Portanto, não devem ser usadas para pular para outro local do código em um ponto especificado.

Quando uma exceção é lançada, o bloco de comandos seguinte não será executado, e o PHP tentará encontrar o bloco “catch” correspondente. Se uma exceção não for detectada, um erro fatal será emitido com a mensagem “Uncaught Exception“.

Em PHP, a notação para se emitir a exception é com a palavra reservada throw seguida de um objeto derivado da classe Exception, que é nativa da linguagem. Este objeto pode ser construído durante a sua emissão, ou então pode ser construído, atribuído a uma variável, manipulado e depois emitido.

Inicialmente, vamos entender como criar uma exceção, para posteriormente incluirmos ela ao nosso php try catch.

Iniciando a exceção através de uma função

Vamos então criar uma função chamada divisão, porém criaremos também uma exception para caso a pessoa tente dividir um número por 0.

<?php
function dividir($x, $y) {
    if ($y == 0) {
        throw new Exception('Não é possível realizar uma divisão por zero');
    }
    $resultado = $x / $y;
    return $resultado;
};
?>

Observe que se chamarmos pela função com valores onde o divisor ($y) seja diferente de 0, teremos o resultado normalmente, porém caso façamos como no código abaixo, teremos outra situação.

<?php
function dividir($x, $y) {
    if ($y == 0) {
        throw new Exception('Não é possível realizar uma divisão por zero');
    }
    $resultado = $x / $y;
    return $resultado;
};

dividir(10,0);
?>

No código acima, a divisão de 10/0 é tratada como uma Exception, portanto nosso navegador vai identificar um erro fatal e também irá enviar a mensagem que deixamos na nossa exceção. No caso acima, receberemos inicialmente a mensagem Fatal error: Uncaught Exception: Não é possível realizar uma divisão por zero.

Utilizando o PHP Try Catch

Agora que já sabemos o que é e para que serve o PHP Try Catch, assim como também já sabemos como criar as exceções, vamos então ver na prática como utilizar o try e o catch.

Vamos utilizar o try, onde incluiremos dentro dela a função criada com a exceção acima. Veja:

<?php
function dividir($x, $y) {
    if ($y == 0) {
        throw new Exception('é uma divisão por zero.');
    }
    $resultado = $x / $y;
    return $resultado;
};

try {
    echo dividir(5,2)."<br/>";
} catch (Exception $e) {
    echo 'Exceção capturada: ',  $e->getMessage(), "\n";
}

?>

Observe que dessa forma, teremos em nosso navegador o valor 2.5 renderizado. Agora vamos modificar, e chamar a função dividir com os parâmetros 5 e 0:

<?php
function dividir($x, $y) {
    if ($y == 0) {
        throw new Exception('é uma divisão por zero.');
    }
    $resultado = $x / $y;
    return $resultado;
};

try {
    echo dividir(5,0)."<br/>";
} catch (Exception $e) {
    echo 'Exceção capturada: ',  $e->getMessage(), "\n";
}

?>

Dessa forma, ao tentar realizar a divisão, ele vai identificar o erro, então pulará para o bloco “catch“. O nosso catch receberá os comandos da exceção e também receberá a variável $e. Posteriormente, executará o bloco de comandos. Observe que para que mostremos a mensagem da exceção, incluímos uma função getMessage().

Dessa forma, teremos então como resultado no nosso navegador: exceção capturada: é uma divisão por zero.

Utilizando Try Catch e Finally

O finally é um bloco de instruções que é colocado em conjunto ao PHP Try Catch. Ele deve ser inserido após o try, caso não possua nenhum catch, ou após o último catch. Portanto, ele especifica quais comandos devem ser executados após os blocos try e catch já terem sido executados.

Digamos que exista um bloco catch, e uma exceção seja capturada. Dessa forma, as instruções do finally só serão executadas apenas após a execução do catch e sua exceção. Agora, caso seja um try que seja executado sem haver nenhuma requisição de exceção, então o finally será executado logo apos o try.

Vejamos então o seguinte exemplo:

<?php
function dividir($x, $y) {
    if ($y == 0) {
        throw new Exception('é uma divisão por zero');
    }
    $resultado = $x / $y;
    return $resultado;
};

try {
    echo dividir(10,2)."<br/>";
    echo dividir(5,0)."<br/>";    
} catch (Exception $e) {
    echo 'Exceção capturada: ',  $e->getMessage(), "\n";
}finally{
    echo "<br> Finalizado.";
}

?>

Observe que dessa forma, teremos como resultado do nosso PHP Try Catch conforme a imagem abaixo:

Resultado do código de exemplo utilizando php try catch e finally

Portanto, o finally traz uma infinidade de novas possibilidades. Nos permite trabalhar como uma finalização aos códigos anteriores. Como, por exemplo, se no try, for criado um arquivo temporário, podemos remover este arquivo quando chegar no finally.

Considerações Finais

Com este artigo, já é possível realizar diversas funções utilizando o PHP Try Catch, assim como também criar suas exceções. Porém, existem diversas exceções já nativas do próprio PHP que você pode estar utilizando. Recomenda-se a leitura do artigo sobre exceções da W3C Schools, ou ainda o no manual do PHP. Também recomendamos a leitura dos nossos artigos, onde você pode encontrar bastante conteúdo sobre o PHP, assim como sobre outros temas ligado a desenvolvimento web e computação. Veja o que separamos para você:

Este artigo foi útil?

Obrigado pela resposta!
Rafael Marques

Rafael Marques

Especialista em Desenvolvimento Web e Marketing. É apaixonado por tecnologia, empreendedorismo, audiovisual e animais. Em sua carreira, dedica-se ao empreendedorismo, além de atuar como Desenvolvedor Fullstack e redator técnico. Gosta de usar seu tempo livre para assistir a filmes, jogar, escrever, e passar um bom tempo brincando e mimando seus animais de estimação.

Contato: rafael.blog@homehost.com.br

Ganhe 30% OFF

Indique seu nome e e-mail,e ganhe um cupom de desconto de 30% para sempre na Homehost!