PHP

Aprenda a dominar os Erros Fatais no PHP 7

Por em

Erros Fatais agora são Exceções no PHP 7. Agora você tem o domínio total sobre eles! Que show hein? Aprenda a tratar os erros e confira aqui um exemplo.


Aprenda a dominar os Erros Fatais no PHP 7
 

Antes do PHP 7, os erros Fatais dominavam a vida dos programadores e trancavam tudo quando apareciam. Todos os métodos e demais operações que seriam executadas após o erro eram esquecidos no além. Agora a situação é diferente. Você poderá salva-los utilizando o super Try Catch. Conhece?

O que é Try /Catch

Para você que não conhece vou apresentar esse camarada. O Try Catch é utilizado em muitas linguagens de programação para evitar quebras bruscas ocasionadas por algum erro ou problema durante um processamento. Em outras palavras, usamos em situações de riscos e ele protege o sistema possibilitando um tratamento adequado quando uma exceção ocorrer.

Antes da era do PHP 7

A vida era diferente antes do PHP 7, pois um erro fatal, simplesmente interrompia totalmente a execução de nossos scripts.

Com o PHP 7

Com a chegada do PHP 7, os seus problemas acabaram! O Try Catch consegue tratar esse erro Fatal, e com isso possibilita um maior controle para o programador na hora de estruturar seus códigos. Mas nem tudo são flores, ainda existem alguns erros que podem travar o sistema como a falta de memória que ainda funcionam como nas versões anteriores do PHP.

Nova hierarquia para erros e exceções

No PHP 7 uma nova hierarquia foi implementada para trabalhar com exceções e erros. Ela foi baseada na Throwable pull request de Sebastian Bergmann.

  • Interface Throwable
    • Exception implements Throwable
    • Error implements Throwable (Replaces EngineException)
      • Error type extends Error
      • ParseError extends Error

Assim, as exceções e erros implementam a interface Throwable.

A interface Throwable especifica os seguintes métodos:

  • getMessage ()
  • getCode()
  • GetFile ()
  • getline ()
  • getTrace ()
  • getTraceAsString()
  • __toString ()

O nome Error foi escolhido para corresponder com outros erros do PHP. Erros não fatais continuarão a disparar alertas e avisos, enquanto os erros fatais são lançados como  Error exceptions.

Classes definidas pelo usuário não podem implementar Throwable. Esta escolha foi feita em parte de previsibilidade e consistência: apenas casos de exceptions ou error podem ser acionada.

interface MyPackageThrowable extends Throwable {}

class MyPackageException extends Exception implements MyPackageThrowable {}

throw new MyPackageException();

Só acredito vendo!

Vamos lá! Hora de meter a mão na massa (ou teclado) e programar um pequeno teste.

Para iniciar, instalei o PHP 7 e baixei o PHP 5.6 para realizar os testes e poder comparar. A ideia foi de salvar os dois na raiz do pc (no C do Windows) e alterar o nome das pastas para testar um e depois testar o outro usando o Servidor embutido de cada um. O teste será com o seguinte código:

function add(int $left, int $right) {
	return $left + $right;
}
 
try {
    echo add("left", "right");
} catch (Exception $e) {
    echo "Exception: " . $e->getMessage();
} catch (Error $e) { 
    echo "Error: " . $e->getMessage();
}

O sistema irá gerar o Erro por causa do tipo dos valores que estou passando por parâmetro e assim cairá no Error e se estiver rodando no PHP 7 a mensagem END será exibida. Já no PHP 5.6 o Erro irá parar todo o script e a mensagem END não será exibida.

Criando um classe para as nossas exceções

Vamos agora realizar um teste e mostrar como implementar uma nova classe com exceções personalizadas.

<?php 

interface MyPackageThrowable extends Throwable {}

class MyPackageException extends Exception implements MyPackageThrowable {}


function add(int $left, int $right) {
	if($left < 0){
		throw new MyPackageException('Left < 0');
	}
    return $left + $right;
}
 
try {
    echo add(-4, 3);
} catch (Exception $e) {
    echo "Exception: " . $e->getMessage();
} catch (Error $e) { 
    echo "Error: " . $e->getMessage();
}

echo "<br/>end";

No exemplo acima, rodando no PHP 7, vamos verificar a exceção que definimos na classe MyPackageException que estende de Exception. Podemos criar também Erros personalizados da mesma forma apenas alterando e estendendo de Error.

Assista ao teste no vídeo

Esse é aquele momento que eu peço para que você clique no play e assista ao teste no vídeo. Deixe seu comentário aqui se tiver dúvidas ou sugestões. Forte abraço!