Wyjątki
14 July 2008
Comments
PHP5 wprowadziło bardzo skuteczny a zarazem prosty sposób obsługi błędów dla klas - wyjątki oraz pomocną klasę Exception. Gdy PHP generuje wyjątek przechwytuje go kopia klasy Exception lub inna klasa potomna. Za pomocą klasy Exception możemy dowiedzieć się co i gdzie nie działa w naszym skrypcie. Wyjątki generują klasy PHP5, można je też generować samemu:
<?php
class klasa
{
public function __construct($liczba1, $liczba2)
{
IF(!is_numeric($liczba1) or !is_numeric($liczba2))
{
throw new Exception('Podane parametry to nie liczby');
}
$this->liczba1 = $liczba1;
$this->liczba2 = $liczba2;
}
public function dodaj()
{
return $this->liczba1+$this->liczba2;
}
public function dziel()
{
IF($this->liczba2 == 0)
{
throw new Exception('Nie można dzielić przez zero');
}
return $this->liczba1/$this->liczba2;
}
}
// stosujemy klasę
try
{
$kl = new klasa(2, 'c');
echo $kl->dziel();
}
catch (Exception $error)
{
echo '<b><u>MAMY PROBLEM</u></b><br />';
echo '<b>Komunikat</b>: '.$error->getMessage().'<br /><b>Plik</b>: '.$error->getFile().'<br /><b>Wiersz</b>: '.$error->getLine();
}
throw new Exception('Komunikat wyjątku');
Kolejny element to przechwytywanie wyjątków. Wywołanie klasy i jej metod ($kl = new klasa(2, 'c'); i echo $kl->dziel();) umieściliśmy w bloku try, po którym mamy blok catch. Jeżeli kod zawarty w try wygeneruje wyjątek to wykonany zostanie kod z bloku catch. $error to zmienna przechowująca obiekt klasy exception posiadającej metody:
- getMessage() - tekstowy opis błędu
- getCode() - liczbowy kod błędu
- getFile() - nazwa pliku, w którym wystąpił błąd
- getLine() - wiersz, w którym wystąpił błąd
- getTraceAsString() - dane z funkcji debug_print_backtrace()
MAMY PROBLEM Komunikat: Podane parametry to nie liczby Plik: /var/www/localhost/htdocs/html/1.php Wiersz: 8
Odnośnie klas potomnych względem Exception - klasy PHP5 generują własne wyjątki, np. SQLite, DOM, SimpleXML itd.:
<?php
try
{
$sqlite = new SqliteDatabase('nieistniejący_katalog/baza');
}
catch (SQLiteException $error)
{
echo $error->getMessage();
}
SQLiteDatabase::__construct() [function.SQLiteDatabase---construct]: unable to open database: /var/www/localhost/htdocs/html/nieistniejący_katalog/baza
Szczegółowe dane są dostępne w dokumentacji danego rozszerzenia.
RkBlog
Comment article