Ponieważ wyjątek jest obiektem możemy sobie go dopasować do naszych potrzeb. Dodanie nowych metod czy właściwości nie sprawi problemu, a może znacznie ułatwić nam prace z naszym systemem.

<?php
class LogEx {
static protected $aLog = array();
static public function add( ProException $Ex ) {
self::$aLog[] = $Ex;
}
static public function get() {
return self::$aLog;
}
}
class ProException extends Exception {
protected $bHandle = false;
public function __construct( $sMessage, $iCode = 0 ) {
parent::__construct( $sMessage, $iCode );
$this->bHandle = false;
LogEx::add( $this );
}
public function handled() {
$this->bHandle = true;
}
public function inHandled() {
return $this->bHandle;
}
public function __toString() {
return __CLASS__ . ': ['.$this->code.']: '.$this->message."\n";
}
}
?>

Powyższy kod obrazuje nam jak bardzo prosto możemy zrobić z wyjątkami to, co nam jest potrzebne. Rozbudowałem wyjątek tak, że będzie on raportował o swoim stanie, to znaczy jest dodawany do listy wyjątków i jeżeli programista go obsłuży, np tak:

<?php
try {
throw new ProException( 'Test' );
}
catch( ProException $Ex ) {
// obsłużony
$Ex->handled();
}
$aExList = LogEx::get();
foreach( $aExList As $Ex ) {
echo ( $Ex->inHandled() ? 'Złapany' : 'Nie złapany' ).' : ', $Ex;
}
?>

Dzięki temu, mamy dostęp do listy wszystkich wyjątków jakie pojawiły się nam podczas pracy systemu. Zostajemy także poinformowani czy systemowi udało się rozwiązać problem. W bardzo prosty sposób możemy także oddać opis jak z danym problemem system sobie poradził.

Oczywiście to co zrobicie z własnymi obiektami zależy tylko od waszej wyobraźni i potrzeb. :-)