Zachytávání výjimek z Facade
- roman.campula
- Člen | 60
Zdravím,
mám dotaz ohledně zachytávání výjimek. Dříve jsem měl funkce např. pro
mazání příspěvku v presenteru. Při jakékoliv chybě ze zachytila
výjimka a pomocí Tracy zapsal log. Pak jsem tyto funkce přesunul do modelu
(facade), ale tím přestalo fungovat automatické logování chyb, asi
logicky.
V presenteru proto výjimky sám zachytávám. Jenže jaké výjimky zachytávat? Nette vyhazuje někdy potomky Error, někdy Exception. Já nikdy nevím, co v modelu nastane za chybu, proto takto zachytávám obě varianty. Musím to opravdu dělat takto duplicitně v podstatě ve všech presenterech u všech funkcí, které mají něco společného s modelem? Neexistuje nějaká elegantnější varianta? Navíc mě mate, proč je např. třída Nette\MemberAccessException potomek třídy Error, když se navíc jmenuje „*Exception“.
presenter:
function actionDeletePhoto($id) {
try {
$this->photosFacade->deletePhoto($id);
$this->flashMessage("Fotoalbum bylo odstraněno", "success");
} catch (\Error $e) {
Debugger::log($e, Debugger::EXCEPTION);
$this->flashMessage("Fotoalbum se nepodařilo odstranit", "error");
} catch (\Exception $e) {
Debugger::log($e, Debugger::EXCEPTION);
$this->flashMessage("Fotoalbum se nepodařilo odstranit", "error");
} finally {
$this->redirect("default");
}
}
Díky za objasnění.
Editoval roman.campula (14. 7. 2020 11:09)
- David Matějka
- Moderator | 6445
Nette vyhazuje někdy potomky Error, někdy Exception
oboje implementují Throwable
v těhle místech většinou nechytám žádné výjimky a nechám je propadnout na generický error handling. Až ve chvíli, kdy z provozu zjistím, že se za určitých podmínek se nějaké chyby stávají, tak je začnu zpracovávat – často jsou to nějaký chyby s konkurencí, tedy třeba deadlocks atd.
jinak obecně se exceptions dělí na dva druhy (někdy může být ta
hranice hůře stanovitelná) a to runtime a logic exceptions. runtime
exceptions často dědí od \RuntimeException
, ty druhé pak
historicky od \LogicException
, od php7 od Error
. Ty
logic exceptions vetšinou nechceš chytat, obvykle ukazují na chybu
programátora, že něco špatně použil (poslal tam string namísto intu atd.)
a často už na ně narazíš při vývoji.
chytání všech výjimek má omezené opodstatnění, obvykle jen nějaký error handler nebo třeba funkce, které po sobě chtějí uklidit, viz třeba transactional v doctrine, které v případě jakékoliv chyby chce rollbacknout transakci
tl;dr; – chytej jen ty výjimky, o kterých víš, že mohou nastat a nemůžeš jim předejít