Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: try-catch v jiném try-catch

Aktivity
Avatar
Ondřej Pech
Člen
Avatar
Ondřej Pech:28.11.2017 12:48

Ahoj, zajímalo by mi, jak moc špatně je mít vnořené try-catch bloky do sebe. Případně jak jinak řešit, pokud v catch bloku volám funkce které mohou taky vyhodit vyjímku?

<?php
try {
    // Něco se má provést - např. vyhledat zákazníka podle IČA
} catch (Exception $e) {
    // Když nenajde žádného tak vyhodí vyjímku
    try {
        // Pokud nenašel podle Iča chci, aby hledal např. podle Variabilního symbolu
    } catch (Exception $e) {
        // Pokud ani teď nenajde vytvořit např. úkol ke kontrole nebo jen zalogovat.
    }
}

Díky za rady a názory. :)

 
Odpovědět
28.11.2017 12:48
Avatar
Marian Benčat:28.11.2017 12:57

Nevím, jak "random" příklad si uvedl, ale to co tady ukazuješ - ten kód, v tom příkladu, tak tomu se říká Exception branching a je to na úrovni GOTO, tedy prasečinka, velmi často zneužívaná.

Exception se používají pro situace, které nemůžeš ovlivnit - třeba obvykle je prostě jen catchuješ z 3rd party knihovny (nebo napříkald musíš dodržet interface), jinak je VŽDY způsob jak tu exception nevyhazovat.

V rozumném jazyce, který patří do roku 2000+ a má podporu generiky, je todle udělat naprosto jednoduché, například pomocí nějaké generické
Result<> classy. Takže v tvém případě by si vracel třeba

Result<Something> Do()

Kde Result má v sobě property jako například Success, Error atp. Chápu ale, že:

  1. V PHP by to znamenalo mít třeba i pro každou metodu 1 nový typ, jelikož nepatří s absencí generiky do roku 2000+
  2. Kód na úrovni GOTO je pro tebe jednodušší na zápis, pokud to po sobě nemusíš třeba měnit / číst.

Takže na tvoji otázku - i kdyby si měl jen jeden try-catch tak zrovna v tomdle případě jde o zneužití exception k branchování programu.

Editováno 28.11.2017 12:59
Nahoru Odpovědět
28.11.2017 12:57
Totalitní admini..
Avatar
Odpovídá na Ondřej Pech
Luboš Běhounek Satik:28.11.2017 12:58

Pokud nenajdes zakaznika podle ica, tak bys nemel hned vyhazovat vyjimku, ale hledat podle VS a az treba pak vyhazovat vyjimku, kdyz nenajdes ani podle VS.

Nahoru Odpovědět
28.11.2017 12:58
https://www.facebook.com/peasantsandcastles/
Avatar
dez1nd
Člen
Avatar
Odpovídá na Luboš Běhounek Satik
dez1nd:28.11.2017 13:26

Vyjímky bych použil jen v momentě kdy je třeba nedostupný server, ale určitě ne na tohle.

 
Nahoru Odpovědět
28.11.2017 13:26
Avatar
Odpovídá na Ondřej Pech
Michal Štěpánek:28.11.2017 13:50

Problém tvého případu je, že i když nic nenajde, stále to není chyba, při které by skočil na "catch". Tam přeskočí pouze tehdy, když bude nějaká chyba v příkazu, nebo nebude mít potřebný parametr.
Tady bych asi ošetřil jen zpracování výsledku -> (přes "IF -> ELSE") co má udělat, když najde a co když nenajde... Ale určitě se na toto nehodí použití vyjímky..

Nahoru Odpovědět
28.11.2017 13:50
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na dez1nd
Luboš Běhounek Satik:28.11.2017 13:52

A jak vis, ze toho zakaznika podle ICO netaha z nejakeho serveru? :)

Nahoru Odpovědět
28.11.2017 13:52
https://www.facebook.com/peasantsandcastles/
Avatar
Ondřej Pech
Člen
Avatar
Ondřej Pech:28.11.2017 14:00

Takže správně je to udělat nějak takto? Aby funkce nevyhazovali vyjímku ale vraceli false když nenajdou :

// Hledání zákazníka
$zakaznik = $spravceZakazniku->vratZakaznikaPodleIco($ico);

if(!$zakaznik){
    $zakaznik = $spravceZakazniku->vratZakaznikaPodleVs($vs);
}

// To co de bude dělat když najde / nenajde
if ($zakaznik) {
    // Když sem ho našel tak něco udělat
} else {
    // Když jsem ho nenašel
}
 
Nahoru Odpovědět
28.11.2017 14:00
Avatar
Odpovídá na Ondřej Pech
Marian Benčat:28.11.2017 14:26

Ne false.. to je jen další dynamické hovno.. Prostě si návratovou hodnotu máš do něčeho obalit a vracet to.

$vysledek = neco();
if (vysledek.success) {
pokracuj(vysle­dek.data)¨;
}
else {
zaloguj (vysledek.chyba);
...
}

Nahoru Odpovědět
28.11.2017 14:26
Totalitní admini..
Avatar
dez1nd
Člen
Avatar
Odpovídá na Luboš Běhounek Satik
dez1nd:28.11.2017 17:50

To byl jen pripad na co to pouzit.

 
Nahoru Odpovědět
28.11.2017 17:50
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.