Jest to biblioteka uruchomieniowa działająca w środowisku Microsoft Windows, wymagana jest to użytkowania programów napisanych w językach .NET. Zatem na pierwszy rzut oka można by pomyśleć że to pewnego rodzaju ograniczenie, ależ nic bardziej mylnego! Programy napisane w języku .NET są kompilowane do tak zwanego kodu pośredniego i podczas pierwszego uruchomienia aplikacji na danym komputerze, zostaje kod pośredni przekształcony w kod maszynowy, dostosowany do systemu operacyjnego i architektury procesora posiadanego przez użytkownika.
Co w tym takiego cudownego? Wydaje się, że to tylko nie potrzebna strata zasobów na ten cały .NET Framework, a jednak! Dzięki takiemu podejściu do sprawy, programista nie musi się martwić już jaki system operacyjny czy też procesor będzie posiadał użytkownik ponieważ korzysta z .NET Framework’a, który sam oceni co trzeba wykonać, aby wszędzie kod został poprawnie zinterpretowany. To nie koniec udogodnień jakie niesie nam .NET Framework, jednym z najważniejszych – moim zdaniem – jest możliwość z korzystania z bibliotek napisanych w innych językach! Pozwala na to na bezproblemowe używanie kodu napisanego w innym języku (pod warunkiem że korzysta z .NET Framework’a). Znika problem kompatybilności innych bibliotek i to jest całe piękno Framework’ów. Biblioteka napisana do tego samego framework’a bez problemów zostaje uruchomiona i w pełni kompatybilna z całą aplikacja.
Jeżeli wyjątek nie zostaje pochwycony, zostaje wyświetlona informacja niesiona z wyjątkiem, wraz z jednoczesnym zatrzymywaniem wykonywania skryptu w miejscu jego wystąpienia. Powinieneś już wiedzieć bardzo dużo na temat wyjątków, przedstawię jeszcze jak to działa w praktyce.
<?php class MyException extends Exception {} echo 'Test 1'."\n"; try { throw new MyException(); } catch( MyException $e ) { // Ten kod zostanie wykonany echo '1. MyException'."\n"; } catch( Exception $e ) { // pominięty ponieważ blok powyżej został wykonany echo '1. Exception'."\n"; } // Dalszy kod wykonany :) echo 'Test 2'."\n"; try { throw new Exception(); } catch( MyException $e ) { // Ten kod zostanie pominięty, nie pasuje do wyjątku echo '2. MyException'."\n"; } catch( Exception $e ) { // Ten kod zostanie wykonany echo '2. Exception'."\n"; } // Dalszy kod wykonany :) echo 'Test 3'."\n"; try { throw new MyException(); } catch( Exception $e ) { // Ten kod zostanie wykonany, ponieważ MyException dziedziczy Exception echo '3. Exception'."\n"; } // Dalszy kod wykonany :) echo 'Test 4'."\n"; try { // tu nie będzie wyjątku $sNull = null; } catch( Exception $e ) { // pominięty, ponieważ nie ma wyjątku echo '4. Exception'."\n"; } echo 'Koniec'."\n"; ?>
Proponuje abyś sam uruchomił ten kod i wyciągną wnioski patrząc na źródło i efekt wyświetlony w przeglądarce. Chyba ten przykład rozwiał wszelkie Twoje wątpliwości, dotyczące działania wyjątków.
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. :-)