Jak co nejlépe psát výjimky

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
darthcz
Člen | 113
+
0
-

Dobrý den,

chtěl bych vás poprosit o pomoc s psaním výjimek. Respektive kam je vhodné je psát a kde je vhodné je zachytávat.

Mám například tuto funkci:

public function insertRow($table, $data = array()){

           if (empty($table))
               throw new LogicException('Nebyla zadána tabulka pro db!');
           try{
               return dibi::query('INSERT INTO ['.$table.']', (array) $data);
           }
           catch (DibiException $exception) {
               if (preg_match('/Duplicate entry/',$exception->getMessage()))
                   return array('-1' => 'Záznam již existuje!');
               else
                   echo $exception->getMessage();
           }
       }

je uložena v baseModelu, Blok try je na volání dibi::query – předpokládám, že by mohla skončit chybou a vyvolat výjimku, kterou následně zachytím. Pokud ale mám prázdnou tabulku, vyhazuji logickou výjimku. Kde se tato výjimka zachytává? V errorPresenteru? Nebo ji lze zachytávat i jinde? Popřípadě jak se toto řeší?

Za odpověď děkuji.

Mikulas Dite
Člen | 756
+
+1
-

Tohle téma zpracovával Jakub Vrána na svém blogu.

Osobně bych výjimku ošetřil v jiném modelu, který volá tuto metodu insertRow(). Například funkce registerUser() by použila insertRow() a pokud by ta vrátila chybu, uložil bych to do logu a uživatele informoval třeba pomocí flash message (pád aplikace ani error presenter nejsou v tomto příkladu vhodnější). Analogicky jdou zpracovat podobné scénáře, ale určitě jsou i jiné situace, kde odlišný postup bude lepší.

V tomto případě je výjimka spíš InvalidArgument nebo podobná, ale to je vedlejší.

Editoval Mikulas Dite (4. 11. 2010 19:29)