NuLL
29.03.2005, 22:20:41
Hi all

Ostatnio trochę więcej czasu zacząłem poświęcać PHPv5(ale ja opóżnoiony). Wiadomo wprowadzono obslugę wyjątków. Ja od dawien dawna stosuję trigger_error któremu jako ciąg podaję zserializowaną tablicę i po wszystkim - mam fallbacki, nr linii funckje plik i co mi się rzewnie zamarzy

i wyjatki wydja mi zbedne. Jakie wg. Was plusy posiadaja wyjatki nad trigger'em

Po szczerze mówiąc nie chce mi się definiować miliarda wyjątków dla jakieś większej aplikacji...wole wciąż podpinać własny error_handler...
bela
29.03.2005, 22:41:13
Wyjątki, jak sama nazwa wskazuje, służą do obsługi sytuacji wyjątkowych.
Czyli np, mamy sobie akcje i w pewnym momencie wystąpi jakaś nietypowa, że tak nazwijmy sytuacja, wtedy wyrzucamy wyjątek ( throw new CannotPerformException() ), a łapiemy go w ten sposób
<?php
try {
$action->perform();
} catch (CannotPerformException $cpe) {
$controller->performOtherAction();
} catch (Exception $e) {
}
?>
Czyli,
Próbujemy wykonać akcje, jeśli nie powiedzie się to wywołujemy inną akcje (catch(Cann....)), a drugi catch służy do przechwycenia wyjątków które mogły się gdzieś zawieruszyć.
Btw gdzie się finally podziało :]
NuLL
29.03.2005, 22:53:47
Czyli w pewnym sensie nie musze się aż tak pilnować raportowania błędów ?
Z drugiej sstrony w tym performie() ja moge zadbac o obsluge wszystkich bledów....
bela
29.03.2005, 22:58:19
Ja jak używałem kiedyś tego trigger_error, to traktowałem to bardziej jako narzędzie debugujące.
Wyjątki eliminują(!) wszystkie w tym momencie zbędne if/else do obsługi błędów, zmiejszają kod i pozwalają na większe ponowanie nad nim.
dasko
30.03.2005, 12:34:51
Według mnie zaletą wyjątków jest to, że od razu widać, które części kodu są do obsługi błędu, a które nie.
Poza tym definiowanie własnej klasy, dziedziczącej po klasie Exception pozwala na stworzenie specyficznego wyjatku np. dla każdego modułu. A tak to tylko 13 typów błędów wbudowanych.
Ciekawe dlaczego twórcy PHP5 nie zrobili instrukcji finally. Z takim czymś 'wyjątkowość

' miałaby jeszcze więcej zalet.
Leezard
30.03.2005, 12:41:09
ja swojego czasu nie moglem sie przekonac do wyjatkow zarowno w C++ jak i w JAVA, uzywalem mnostwa tych nieszczesnych if'ow.
Jednak przy budowie czegos wiekszego, a nawte nie tylko - np patrzac w czyjs kod, na oko widac co jest co, co gdzie lapiesz jesli masz ladnie wyjatki nazwane, poza tym propagacja rzuconych wyjatkow w gore, bez koniecznosci bawienia sie w zwracanie jakis dziwnych rzeczy
a w php finally faktycznie by sie przydalo
bela
30.03.2005, 12:51:30
Cytat(Leezard @ 2005-03-30 12:41:09)
a w php finally faktycznie by sie przydalo
I jeśli będzie chęć ze strony użytkowników to najprawdopodoniej twórcy php wprowadzą finally, zgodnie z tym co mówili w wywiadzie ( któreś tam php solution, w empiku czytałem więc nie powiem

).
hawk
30.03.2005, 14:54:30
Zresztą wyjątki i trigger_error mają ze sobą mało wspólnego. Wyjątki służą do obsługi błędów, a trigger_error do logowania, debugowania i eleganckiego wywalania aplikacji.
Imperior
30.03.2005, 16:43:15
tak na marginesie: pamiętajcie o exception_handler()
Vengeance
30.03.2005, 17:16:06
Z tego co gdzieś wyczytałem, to finally było na liście TODO, ale jakiś user posłał maila, iż jest to wielce nieprzydatne i sztab php finally nie dodał.
Źródła nie podam, nie pamiętam. Może to i błędna informacja :]
NuLL
11.04.2005, 20:59:08
Ja np. załuje, że wyjątki w SPL i standowych funkcjach gereują tylko konstruktory

, żeby wszystkie funkcje wywałały wyjątki(tak bez throw

) to by było cool

@Imperior - handler wyjątków już podpięty

Natomiast pomysł z finnaly jest fajny

Może w 5.1 ?
dr_bonzo
12.04.2005, 08:00:05
Chyba widzialem takie rozwiazanie na forum: error_handler wylapywal errory i wyrzucal exception.
Imperior
12.04.2005, 15:31:24
Wydaje mi się, że ta funkcja powinna byc gdzieś w komentarzach manuala.
M4chu
12.04.2005, 16:40:37
<?php
class PHPErrorException extends Exception
{
private $context = null;
public function __construct
($code, $message, $file, $line, $context = null)
{
parent::__construct($message, $code);
$this->file = $file;
$this->line = $line;
$this->context = $context;
}
};
function error_handler($code, $message, $file, $line) {
throw new PHPErrorException($code, $message, $file, $line);
}
function exception_handler(Exception $e)
{
E_USER_ERROR => \"User Error\",
E_USER_WARNING => \"User Warning\",
E_USER_NOTICE => \"User Notice\",
);
echo $errors[$e->getCode()].': '.$e->getMessage().' in '.$e->getFile(). ' on line '.$e->getLine().\"n\";
echo $e->getTraceAsString(); }
set_exception_handler('exception_handler');
// Throw exception with an /unkown/ error code.
throw new Exception('foo', 0);
?>
Nievinny
13.04.2005, 13:47:53
Ciekawe to, muszę przetestować takie rozwiązanie, tylo czy to obsługuje błędy wywalene też przez funkcje takie jak np: set_cookie() ?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę
kliknij tutaj.