Autor Zpráva
rout
Profil *
Dobrý den,
K čemu je dobré v php používat výjimky a jak je používat? Například pokud mám třídu a dvě metody, jak je použiji aby mi fungovali? Pokud napíši například toto, vrátí straně dlouhou chybu.

class A{

function a{
//kód
if($c != "2"){
throw new Exception("chyba1");
}
}

function b {
//kód
if($c < $d){
throw new Exception("chyba2");
}
}
}


Pokud je v kódu chyba, tak se omlouvám, psal jsem ho z hlavy. Odpověď jsem hledal na internetu, ale asi jsem nepochopil jak s výjimkami pracovat.
Kcko
Profil
Viz manuál http://php.net/manual/en/language.exceptions.php
rout
Profil *
Na to jsem úplně zapomněl, děkuji. Jinak try a catch se používají ve třídě, metodě, nebo úplně mimo?
Kcko
Profil
Dle potřeby.
Joker
Profil
rout:
vrátí straně dlouhou chybu
Víc by nám pomohlo napsat jakou chybu to vrátí, než informace, že je „strašně dlouhá“.

V tom příkladu výše si to například může stěžovat na to, že proměnné $c a $d neexistují.

K čemu je dobré v php používat výjimky a jak je používat?
Výjimky jsou užitečné pro řešení nestandardních situací (což nemusí nutně být „chyby“), kterými je třeba se zabývat někde jinde, než je aktuální kontext v kódu.
Když dám ilustrativní příklad: Řekněme, že z místa A se volá funkce/metoda B, z ní C a z ní D, jejímž účelem je třeba otevřít soubor na disku.
Může se stát, že soubor se nepodaří otevřít. Na to by aplikace měla nějak reagovat, ale neměla by to dělat na místě D, protože tam ani nevíme, jak vlastně aplikace na chyby reaguje.
Takže „klasické“ řešení bez použití výjimek je, že funkce/metoda D vrátí nějakou speciální hodnotu indikující chybu, výsledek D se kontroluje v C, kde se v případě chyby zase vrátí nějaká hodnota, a tak to pokračuje až k A, kde se na chybový stav nějak reaguje.
S použitím výjimek funkce/metoda D vyhodí příslušnou výjimku, ta je zachycena na místě A, které na ni příslušně reaguje.
Smyslem je oprostit všechny mezistupně mezi D (místem vzniku nestandardní situace) a A (místem kde se na situaci reaguje) od nutnosti detekovat a předávat informace o situaci, se kterou jinak vůbec nepotřebují a neumějí pracovat.

Jinak try a catch se používají ve třídě, metodě, nebo úplně mimo?
Kdekoliv je potřeba.
Mělo by se ale dbát na to, aby se na jakoukoliv výjimku někde adekvátně reagovalo.
A připomínám, že adekvádní reakce není anti-pattern „pohlcování výjimek“, který lze občas vidět:
try{
  // celý kód aplikace
} catch (Exception $e) {}
rout
Profil *
function db{
        //pripojeni k db
        if($mysql->connect_error)
        {
            throw new Exception("nelze se připojit k db");
        }
        } catch (Exception $e) {
            echo "Chyba: ".$e->getMessage();
            exit();
        }
}

Je takovýto zápis správný?
Bertram
Profil
Ahoj, ten blok catch tam nepatří, tento blok se hledá pokud se vyhodí vyjímka v bloku try.Takže do bloku try vlož kód ve kterém může dojít k vyjímce nebo vyjímkám a za něj příslušný nebo příslušné bloky catch, které dle tvých představ na vyhozenou vyjímku zareagují.
rout
Profil *
Bertram: Omlouvám se, zapomněl jsem tam napsat try {

Je možné aby chyby zpracovával nějaký jiný soubor, takže bych napsal například jen

if($mysql->connect_error)
{
throw new Exception("nelze se připojit k db");
}

A zbytek by zpracovala například nějaká jiná třída v jiném souboru?
Majkl578
Profil
rout:
Pro generalizaci věci v [#6] se spíš hodí vlastní exception handler.
Bertram
Profil
rout:
A zbytek by zpracovala například nějaká jiná třída v jiném souboru?
Ano jde, ale za předpokladu, že z ní voláš kód (např. metodu třídy pracující s databází), ve kterém může dojít k právě zachytávané vyjímce.

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:

0