Diskuze: Zachycení více výjimek najednou

PHP PHP Zachycení více výjimek najednou American English version English version

Avatar
Martin Konečný (pavelco1998):

Ahoj,

lze nějak zachytit více výjimek najednou, když pro zpracování každé z nich použiji stejný script? Vím, že lze zachytit jejich předka, ale to v mém případě nemohu.

 
Odpovědět 5.2.2014 13:31
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Martin Konečný (pavelco1998)
David Čápka:

Více najednou těžko, specifikuj co chceš udělat. Dá se dát více catch bloků za sebe, chytat předka nebo balit výjimky do sebe.

Nahoru Odpovědět 5.2.2014 14:17
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Martin Konečný (pavelco1998):

Pokusím se udělat velmi jednoduchý příklad:

try {
    if (podmínka) {
        throw new InvalidArgumentException("výjimka č. 1");
    }
    if (jiná podmínka) {
        throw new OutOfRangeException("Výjimka č. 2");
    }
} catch (/* zde bych potřeboval zachytit oba dva typy výjimek */) {

    // script je pro oba typy výjimek stejný
    errorMessage($e->getMessage());
    redirect("...");
}

Nechci psát stejný kód tolikrát, kolik druhů výjimek zachytím. Přes společného předka "Exception" to zachytit nemohu (zkouším to v Nette FW a catch(\Exception) mi zachytí to, co nechci).

Editováno 5.2.2014 14:28
 
Nahoru Odpovědět 5.2.2014 14:27
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Martin Konečný (pavelco1998)
David Čápka:

To je úloha na společného předka. Ty výjimky co chytáš žádného nemají? Podívej se jestli z něčeho ještě nedědí. Pokud ne, je to divné, ale pořád to jde. Můžeš udělat něco jako:

try {
    if (podmínka) {
        throw new InvalidArgumentException("výjimka č. 1");
    }
    if (jiná podmínka) {
        throw new OutOfRangeException("Výjimka č. 2");
    }
} catch (\Exception $e) {
    if ($e instanceof InvalidArgumentException || $e instanceof OutOfRangeException) {
    errorMessage($e->getMessage());
    redirect("...");
  }
}
Editováno 5.2.2014 14:32
Nahoru Odpovědět 5.2.2014 14:32
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Odpovídá na David Čápka
Martin Konečný (pavelco1998):

Děkuji za radu, tento způsob mě nenapadl. Společného předka mají až základní \Exception. Asi bude nejlepší, když jim udělám společného předka sám.

 
Nahoru Odpovědět 5.2.2014 14:37
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Martin Konečný (pavelco1998)
David Čápka:

Ona je otázka, jestli je potřeba vyhazovat tolik typů výjimek. Já v celé aplikaci většinou vyhazuji jen UserException, což je když uživatel něco zadá špatně. Jen tuhle chybu mu potom ukazuji, takže by to mělo být bezpečné.

Nahoru Odpovědět  +1 5.2.2014 14:42
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Odpovídá na David Čápka
Martin Konečný (pavelco1998):

Nejspíš bude stačit používat jen jeden typ. Jen jsem se snažil být co nejpřesnější k typu chyby. :-)

Ještě jednou díky.

 
Nahoru Odpovědět 5.2.2014 14:47
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Zdeněk Pavlátka:

Stačí použít jeden typ a rozdílnou message.

Nahoru Odpovědět 5.2.2014 14:49
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Odpovídá na Zdeněk Pavlátka
Martin Konečný (pavelco1998):

Message mám stejnou, ale byly dva druhy důvodů vyhození výjimky, tak jsem nepoužil stejný typ. Udělám jim nějakého společného předka.

 
Nahoru Odpovědět 5.2.2014 14:54
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.