Autor Zpráva
exception
Profil *
Ahoj, chtěl bych se zeptat, jestli je nutné při zachytávání vyjímek vždy myslet i na odchycení výchozí třídy vyjímek, tedy Exception a nebo ne? Uvedu příklad. Mám metodu, která ukládá data do DB a zjišťuje, zda při vytváření nového záznamu nedochází k duplikaci primárního klíče:

///...
public function create($values)
{
    if ($this->findByName($values->name)) {
        throw new PrimaryKeyException('Name exists.');
    }
    ...
    $this->save($data);
}

public function processData($data)
{
    try {
        $this->create($data);
        
    } catch (PrimaryKeyException $e) {
        $e->getMessage();
    } catch (PDOException $e) {
        $e->getMessage();
    } catch (Exception $e) {
        $e->getMessage()
    }
}

V blocích catch by se toho samozřejmě dalo dělat mnohem více, :-) ale pro ukázku to určitě stačí. Jde mi o to, zda je nutné vždy zachytávat vyjímky až ke třídě Exception nebo lze skončit už u PDOException?
Alphard
Profil
exception:
V blocích catch by se toho samozřejmě dalo dělat mnohem více, :-) ale pro ukázku to určitě stačí
No, nestačí. Tohle je právě ta klíčová věc. PrimaryKeyException je konkrétní typ výjimky, kterou má smysl odchytit, můžete to vrátit do formuláře, změnit název apod.

Odchycení dalších výjimek závisí na tom, jak je ošetřím. Než přišlo finally, dávalo smysl obecné odchycení všeho a v něm např. odemčení zámku, ale tato varianta je již historií. Takže obecné Exception bych nechal na root aplikace, který jen zajistí uživatelsky přívětivé chybové hlášky. Případně prostě tam, kde čekáte problémy, nechcete je moc řešit a když se vyskytnou, nevadí vám je skrýt, protože nic jiného s obecnou Exception asi neuděláte.
Jan Tvrdík
Profil
exception:
Obecně – zachytávající se runtime chyby, které nejsou system failures. Pokud se je rozhodneš nezachytit, tak bys je měl zmínit v @throws anotaci. Kdysi jsem o tom měl přednášku na Poslední sobotě.

Tj. tady má smysl zachytávat pouze PrimaryKeyException + musíš upravit create aby pracovala atomicky, tj. zachytit si v ní PDOException, zkontrolovat, zda jde o chybu kvůli unique indexu a případně převést na PrimaryKeyException. PrimaryKeyException by se měla jmenovat nějak výstižněji, třeba NameAlreadyExistsException.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: