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 (~19 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 (~20 anos atrás)

Novo Comentário:

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