0

Exceptions no PHP5

criado por André Mendonça em 15/08/2005 11:37pm
Obvio que não é só isso. O tratamento de exceções é muito mais poderoso. No exemplo anterior você não diferenciou uma exceção da outra. Agora vamos ver isso mais detalhado. A exceção como é uma classe, você pode herdar e fazer o que quiser, incluindo fazer log, etc. Mas a parte que você mais vai utilizar é apenas o nome da nova classe para controlar o fluxo.

Um exemplo mais detalhado:
<?php
class InvalidLogin extends Exception { }
class InvalidPassword extends Exception { }

function login($user, $password)
{
    // login valido
    if ($user != 'usuario') {
        throw new InvalidLogin($login);
    }
    // senha invalida
    if ($password != 'senha') {
        throw new InvalidPassword($password);
    }
    return new User($user);
}

// tentar fazer o login
try {
    login('eu', 'senha');
    print 'se acima sair uma exceção, essa linha não será executada';
} catch (InvalidLogin $e) {
    // faz alguma coisa
    print $e->getMessage();
} catch (InvalidPassword $e) {
    // faz qualquer coisa
    print $e->getMessage();
}
?>

Destrinchando o "catch". O primeiro parâmetro é o nome da classe de exceção ou super classe. Sim, super classe, você pode utilizar polimorfismo para pegar as exceções.

<?php
try {
    login('eu', 'senha');
} catch (Exception $e) {
    print $e->getMessage();
}
?>

Logo, o "catch" acima pega qualquer exceção, já que toda exceção deve ser herdada da classe Exception para ser jogada.

Porém não controla nada o seu fluxo, o correto é sempre criar um conjunto exclusivo de exceções para cada erro de uma classe. Não se espante, é comum você encontrar classes com mais de 10 exceções. Geralmente você declara todas as exceções em cima da classe que vai jogar para ficar mais fácil de ler o código.

Comentários:

Mostrando 1 - 2 de 2 comentários
Click disse:
Bem explicado, recomendo apenas colocar códigos já testados.
Por exemplo, o exemplo da página 5 retornou:
Fatal error: Call to undefined function NotExists() in exception.php on line 33

Ah sim, na linha 33: throw NotExists($path);

[]s


05/03/2006 5:46pm (~14 anos atrás)

parabéns pelo artigo!!
muito bom e bem explicado...
issu vai ser muito útil para o meu sistema de log de erro
:p

;)

17/08/2005 7:19am (~15 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)