Wyjątki: Różnice pomiędzy wersjami

Z PHPEdia.pl
Skocz do: nawigacji, wyszukiwania
(Instrukcja '''throw''')
(Przykładowy kod użycia wyjątków)
Linia 7: Linia 7:
 
= Użycie wyjątków =
 
= Użycie wyjątków =
  
== przykładowy kod użycia wyjątków ==
+
{{WEdycji}}
<source lang="php"><?php
+
$foo = 5;
+
try {
+
    // jesli $a jest liczbę caśkowitą...
+
    if(is_int($foo)) {
+
        // ...wyrzucamy wyjątek
+
        throw new Exception('$foo jest liczbę caśkowitą!');
+
    }
+
    // jesli wyrzucono wyjątek, ten kod nie zostanie wykonany
+
    echo 'blah';
+
}
+
// przechwytujemy wyjątek
+
catch(Exception $e) {
+
    // odpowiednia obsługa zaistniaśego wyjątku
+
    echo $e;
+
}
+
?></source>
+
Wyjście tego skryptu:
+
<pre><nowiki>$foo jest liczbę caśkowitą!</nowiki></pre>
+
  
 
== Blok '''try''' ==
 
== Blok '''try''' ==

Wersja z dnia 10:28, 3 maj 2005

Czym są wyjątki

Wyjątek wykorzystywany jest do przechwytywania informacji o "nadzwyczajnych" sytuacjach. Pozwala on na redukcję ilości konstrukcji warunkowych i w przypadku zaistnienia wyjątku na przeskoczenie caśego bloku kodu.

Wyjątki w PHP

Wyjątki w PHP zostały zaimplementowane poczćwszy od wersji 5. składnia ich wyrzucania/przechwytywania jest zapożyczona z języków C++ i Java.

Użycie wyjątków

Ktoś właśnie przeprowadza gruntowną edycję tego artykułu.
Aby zapobiec konfliktom edycji inni użytkownicy proszeni są o niedokonywanie w nim zmian do czasu usunięcia tego komunikatu. Jeśli chcesz dowiedzieć się, kto i kiedy rozpocząć pracę nad tym artykułem, zajrzyj do jego historii

Blok try

W bloku try ograniczonym klamerkami powinien znależą się kod, który ewentualnie może wyrzucić jakiś wyjątek. Zauważ, że napotkawszy instrukcję throw, kośczy się wykonywanie dalszego kodu w klamerkach - widać to w pokazanym wyżej przykładzie - skrypt nie wyświetla...

$foo jest liczbę caśkowitą!
blah

Po bloku try musi następić przynajmniej jeden blok catch.

Instrukcja throw

Instrukcja throw służy do wyrzucania wyjątku. Po słowie throw powinna znależą się obiekt klasy Exception lub klasy dziedziczącej po niej. Jeśli instrukcja throw nie znajduje się w w bloku try, a wiąc wyjątek przez nić wyrzucony nie może być przechwycony, PHP generuje błąd krytyczny (Fatal Error).

Blok catch

Blok catch pozwala na przechwycenie zaistniaśego wyjątku i wykonanie odpowiednich czynności. Instrukcja catch pobiera jeden argument w postaci "Klasa $zmienna", gdzie Klasa to rodzaj wyjątku (Exception lub pochodna), a $zmienna to zmienna, za pomocą której będziemy odwośywać się do przechwyconego wyjątku. Możemy napisać kilka następujących po sobie bloków catch - np. dla różnej obsługi różnych typów wyjątków.

Klasa Exception

właściwości i metody

Klasa Exception posiada szereg właściwości i metod, umożliwiające wyciąganie informacji o wyjątku:

<?php
class Exception
{
   protected $message = 'Unknown exception';  // tresc wyjatku
   protected $code = 0;                        // kod wyjatku
   protected $file;                            // plik, w ktorym wystapil wyjatek
   protected $line;                            // linia, w której wystąpiś wyjątek
 
   public function __construct($message = null, $code = 0); // konstruktor
 
   final public function getMessage();                // zwraca wiadomość wyjątku
   final public function getCode();                  // zwraca kod wyjątku
   final public function getFile();                  // zwraca nazwę pliku
   final public function getLine();                  // zwraca numer linii
   final public function getTrace();                  // zwraca tablicć trace
   final public function getTraceAsString();          // zwraca tablice trace w formie ciągu
 
   /* Do nadpisania */
   public function __toString();                      // wyjątek w formie ciągu
}
?>

Wbudowane wyjątki

Od PHP 5.0

W PHP 5.0 wbudowana jest jedynie bazowa klasa dla wyjątków: Exception.

Od PHP 5.1

Od wersji 5.1 zbiór wyjątków zostaje rozszerzony o te ze Standardowej Biblioteki PHP:

Tworzenie własnych klas wyjątków

W PHP można stworzyć własną klasą wyjątku i nadać jej odpowiednią nazwę, aby potem mżc np. inaczej obsługiwać każdy rodzaj wyjątku. Tworzenie swojego wyjątku polega po prostu na zdefiniowaniu klasy dziedziczącej po klasie Exception:

<?php
class MyException extends Exception {
 
   /**
    * Metoda __toString()
    * Przeksztaśca wyjątek w ciąg
    * Jedyna nadpisywalna metoda klasy Exception
    *
    * @access public
    * @return string
    */
   public function __toString() {
      return '<b>MyException:</b>: ' . $this->getMessage();
   }
 
}
?>

przykładowy kod wykorzystujący nową klasą:

<?php
$bar = 'jakasZmienna';
try {
    if(is_int($bar)) {
        throw new Exception('$bar jest liczbę caśkowitą');
    }
    elseif(is_string($bar)) {
        throw new MyException('$bar jest ciągiem');
    }
    echo 'blah';
}
// wychwytujemy zwykly wyjątek
catch(Exception $e) {
    echo 'Wystąpiś wyjątek w pliku ' . $e->getFile() . ' w linii ' . $e->getLine();
}
// wychwytujemy MyException
catch(MyExcpetion $e) {
    echo $e;
}
?>

W zależności od typu zmiennej $bar kod wygeneruje odpowiedni wyjątek, w zależności od wyjątku kod wyświetli odpowiednią wiadomość.

obsługa nieprzechwyconych wyjątków

Jak wiadomo, dla błędów można ustawią własną obsługę. Podobnie jest z nieprzechwyconymi wyjątkami - służy do tego funkcja set_exception_handler(). Pobiera ona jako argument nazwę funkcji, która ma być uruchomiona, gdy wyjątek nie zostanie w żaden sposób przechwycony. Niestety, wykonywanie skryptu zatrzymuje się po pierwszym 'nieprzechwyceniu' wyjątku.

Polecamy również

Dziaś w manualu poświącony wyjątkom

artykuł na Zend.com poświącony wyjątkom