Zachytávání výjimek z Facade

roman.campula
Člen | 60
+
0
-

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
+
+4
-

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