| Autor | Zpráva | ||
|---|---|---|---|
| rout Profil * |
#1 · Zasláno: 23. 10. 2011, 16:51:47
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 |
#2 · Zasláno: 23. 10. 2011, 17:20:03
|
||
| rout Profil * |
#3 · Zasláno: 23. 10. 2011, 17:24:34
Na to jsem úplně zapomněl, děkuji. Jinak try a catch se používají ve třídě, metodě, nebo úplně mimo?
|
||
| Kcko Profil |
#4 · Zasláno: 23. 10. 2011, 17:40:05
Dle potřeby.
|
||
| Joker Profil |
#5 · Zasláno: 23. 10. 2011, 18:04:46
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 * |
#6 · Zasláno: 23. 10. 2011, 18:37:11
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 |
#7 · Zasláno: 23. 10. 2011, 20:48:50
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 |
#9 · Zasláno: 23. 10. 2011, 23:18:40
|
||
| Bertram Profil |
#10 · Zasláno: 24. 10. 2011, 12:18:19
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. |
||
|
Časová prodleva: 15 let
|
|||
0