0

Exceptions no PHP5

criado por André Mendonça em 15/08/2005 11:37pm
Como eu disse anteriormente, um "throw" provoca um efeito em cascata e interrompe os códigos das chamadas anteriores até que a exceção seja tratada.

Vamos a mais um exemplo, uma classe:

<?php
class AlreadyExists extends Exception { }
class NotExists extends Exception { }
class InvalidDirName extends Exception { }

class Disk 
{
    /**
     * @var string $path Nome da pasta atual
     */
    protected $path;

    /**
     * Construtor
     * @param string $path Nome da pasta do disco
     */
    public function __construct($path = null)
    {
        if ($path !== null) {
            $this->open($path);
        }
    }

    /**
     * Abre uma pasta para manipulação
     * @param string $path Nome da pasta
     */
    public function open($path)
    {
        if (is_dir($path)) {
            $this->path = $path;
        } else {
            throw NotExists($path);
        }
    }

    /**
     * Cria uma nova pasta
     * @param string $path Nome da nova pasta
     */
    public function make($path)
    {
        if (file_exists($path)) {
            throw new AlreadyExists($path);
        }
        if (!ereg('[a-zA-Z]', $path)) {
            throw new InvalidDirName($path);
        }
        mkdir($path);
        $this->open($path);
    }
}
?>

Uso:
<?php
try {
    $disk = new Disk('lol');
} catch (NotExists $e) {
    /*
     * nesse caso o obj $disk nao existe
     * pois o throw do metodo open, fez um efeito em cascata
     * e nao deixou o construtor terminar
     */
    print 'diretorio invalido';
}
?>

Outro exemplo, controlando o fluxo:

<?php
$path = 'lol';
$disk = new Disk();

try {
    // tenta abrir
    $disk->open($path);
} catch (NotExists $e) {
    /**
     * A pasta ainda nao existe
     * esse é um exemplo onde a exceção não é um erro
     */
    try {
        $disk->make($path);
    } catch (InvalidDirName $e) {
        // isso é um erro
        print 'Nome de diretorio invalido: ' . $e->getMessage();
    }
}
?>

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.)