Obsługa wyjątków w PHP

Stronę tą wyświetlono już: 114 razy

Obsługa wyjątków w PHP za pomocą instrukcji try, catch wygląda następująco:

Listing 1
  1. <?php
  2. $x = 0;
  3. try{
  4. if(!$x)
  5. throw new Exception("Próbujesz obliczyć logarytm naturalny z zera");
  6. $value = log($x);
  7. }catch(Exception $e){
  8. echo("Błąd w linii: " . $e->getLine() . ": " . $e->getMessage());
  9. }
  10. ?>

Wynik działania powyższego kodu:

Błąd w linii: 5: Próbujesz obliczyć logarytm naturalny z zera

Jak widać klasa Exception w PHP zajmuje się obsługą błędów, udostępniając opis błędu, miejsce jego wyrzucenia i parę innych rzeczy też. Oto konstrukcja klasy Exception:

Listing 2
  1. Exception {
  2. // pola klasy
  3. protected string $message ;
  4. protected int $code ;
  5. protected string $file ;
  6. protected int $line ;
  7. // metody
  8. public __construct ([ string $message = "" [, int $code = 0 [, Throwable $previous = NULL ]]] )
  9. final public string getMessage ( void ) // zwraca komunikat wyjątku (opis wyjątku)
  10. final public Exception getPrevious ( void )
  11. final public mixed getCode ( void ) // kod błędu (domyślnie 0)
  12. final public string getFile ( void ) // zwraca nazwę pliku, w którym błąd wystąpił
  13. final public int getLine ( void ) // zwraca linię wyrzuconego wyjątku
  14. final public array getTrace ( void )
  15. final public string getTraceAsString ( void )
  16. public string __toString ( void )
  17. final private void __clone ( void )
  18. }

Kod wcześniej rzuconego wyjątku przeróbmy do następującej postaci:

Listing 3
  1. <?php
  2. function ln($value){
  3. if(!$value)
  4. throw new Exception("Próbujesz obliczyć logarytm naturalny z zera");
  5. return log($value);
  6. }
  7. try{
  8. $val1 = ln(10);
  9. echo("<p>" . $val1 . "</p>");
  10. $val2 = ln(0);
  11. echo("<p>$val2</p>");
  12. $val3 = ln(5);
  13. echo("<p>$val3</p>");
  14. }catch(Exception $e){
  15. echo("Błąd w linii: " . $e->getLine() . ": " . $e->getMessage());
  16. }
  17. ?>

by zrozumieć, że linia kodu wywołania błędu zawsze będzie zwracana przez metodę getLine klasy Exception:

2.302585092994

Błąd w linii: 4: Próbujesz obliczyć logarytm naturalny z zera

Można też tworzyć własne klasy wyjątków, np. tak:

Listing 4
  1. <?php
  2. class lnFromZeroException extends Exception{
  3. public function __construct(){
  4. parent::__construct("Próbujesz obliczyć logarytm naturalny z zera");
  5. }
  6. }
  7. function ln($value){
  8. if(!$value)
  9. throw new lnFromZeroException();
  10. return log($value);
  11. }
  12. try{
  13. $val1 = ln(10);
  14. echo("<p>" . $val1 . "</p>");
  15. $val2 = ln(0);
  16. echo("<p>$val2</p>");
  17. $val3 = ln(5);
  18. echo("<p>$val3</p>");
  19. }catch(Exception $e){
  20. echo("Błąd: " . $e->getLine() . ": " . $e->getMessage());
  21. }
  22. ?>

Komentarze