Exceptions – Tratamento de Erros

Sem mais delongas, vamos ao que interessa! Hoje falarei de tratamentos de erros utilizando as Exceções (Exceptions), que o PHP dá suporte a partir de sua versão 5. Em muitos projetos que participei, notei que poucos desenvolvedores utilizam este recurso, que em minha opinião, é de extrema importância para vida de uma aplicação. Vamos ver a definição do PHP sobre esse cara:

PHP 5 tem um modelo de exceção similar ao de outras linguagens de programação. Uma exceção pode ser disparada ou pega.

Seguindo ao pé da letra a definição da documentação, utilizaremos as exceções em duas situações: para disparar ou para capturá-las.

DISPARANDO EXCEÇÕES

Para dispararmos uma exceção no php, utilizamos a palavra reservada throw seguindo com a instanciação de uma classe filha de Exception ou instanciação da própria pai Exception. Vamos ver um pequeno exemplo de utilização:

1
2
3
4
$salario = -3;
if($salario < 0) {
    throw new Exception(“Informe um valor positivo.”);
}

Caso a nossa variável $salario for menor que zero, ou negativa, será disparado um exceção com a mensagem “Informe um valor positivo.”. Caso esta exceção seja disparada, o interpretador PHP lançará a mensagem no seguinte formato:

Fatal error: Uncaught exception ‘Exception’ with message ‘Informe um valor positivo.’

Tradução: Erro Fatal: Exceção ‘Exception’ não capturada com a mensagem ‘Informe um valor positivo.’

Aqui notamos que a exceção foi dispara com sucesso! Porém, a forma de como a mensagem foi mostrada não está muito agradável. Já imaginou se um cliente seu (que é baita leigo em desenvolvimento) visualiza uma mensagem desta em sua aplicação ou site ? Para isso que temos como pegar esses caras e coloca-los em seu devido lugar, vamos ver abaixo.

CAPTURANDO EXCEÇÕES

Antes de falar de como capturar uma exceção, irei mostrar aqui os métodos da classe Exception do PHP (para mais detalhes, veja na documentação da classe):

  • __construct(string $message=NULL, int code=0) – O método construtor possui 2 parâmetros não obrigatórios, porém, é de grande importância sempre colocar uma mensagem, como no exemplo anterior.
  • getMessage() – retorna a mensagem da exceção.
  • getCode() – retorna o código da exceção.
  • getFile() – retorna o arquivo e a linha em que foi disparado a exceção
  • getTrace() – retorna um Array com a(s) rota(s) até onde foi disparado a exceção.
  • getTraceAsString() – retorna uma string com a(s) rota(s) até onde foi disparado a exceção.

Como na maioria das outras linguagens de programação, para pegarmos uma exceção utilizamos um bloco chamado try – catch. Vejamos o código abaixo:

1
2
3
4
5
6
7
8
9
10
try {
    // Fazer alguma rotina
} catch(Exception $e) {
    echo “Mensagem: ” . $e->getMessage() . “<br />”;
    echo “Arquivo: ” . $e->File() . “<br />”;
    echo “Rota: ” . $e->getTraceAsString() . “<br />”;
    die();
}

TÁ TÁ…MUITO LEGAL E TUDO, MAS ME MOSTRE QUANDO UTILIZAR EXCEÇÕES

Ótima ideia meu jovem guerreiro padawan, vamos a um exemplo prático para fixar esse tal de Exception:

Primeiro criaremos uma classe chamada “MeuException”, que simplesmente extenderá a classe Exception do PHP para caso precisarmos sobrecarregar os métodos da classe Exception futuramente.

1
2
3
class MeuException extends Exception {
}

Agora, criaremos uma classe chamada “Pessoa” que tem o seguinte escopo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Pessoa {
    public $nome;
    public $idade;
    public $peso;
    public function imprimirDados() {
        if(is_null($this->nome)) {
            throw new MeuException('Digite o nome.');
        }
        if(is_null($this->idade)) {
            throw new MeuException('Digite a idade.');
        }
        if(is_null($this->peso)) {
            throw new MeuException('Digite seu peso.');
        }
        echo 'Nome: ' . $this->nome . ' - Peso: ' . $this->peso . ' - Idade: ' . $this->peso;
    }
}

Definimos alguns atributos relacionado a uma pessoa e um método chamado “imprimirDados”. Esse método apenas imprimirá as informações de uma pessoa caso os mesmos não sejam nulos. Vamos testar!
Em um arquivo chamado “index.php”, iremos fazer o seguinte:

1
2
3
4
5
6
7
8
9
10
11
12
13
include_once “MeuException.php”;
include_once “Pessoa.php”;
try {
    $pessoa = new Pessoa();
    $pessoa->nome = "Kilderson Sena";
    $pessoa->imprimirDados();
} catch (MeuException $e) {
    echo "Mensagem: " . $e->getMessage() . '<br />';
    echo "Arquivo: " . $e->getFile() . " (Linha {$e->getLine()})<br />";
    echo "<pre>" . $e->getTraceAsString() . "</pre>";
}

Desta forma, será capturado um Exception no formato que está dentro do bloco catch.

Bom, acho que é isso! Tentei ser o mais claro possível no que se diz respeito a tratamento de erros com exceções.

Fonte: http://www.mxmasters.com.br/artigo/exceptions-tratamento-de-erros/

Deixe um comentário