Diskuze: try-catch v jiném try-catch
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 9 zpráv z 9.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
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:
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.
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.
Vyjímky bych použil jen v momentě kdy je třeba nedostupný server, ale určitě ne na tohle.
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..
A jak vis, ze toho zakaznika podle ICO netaha z nejakeho serveru?
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
}
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(vysledek.data)¨;
}
else {
zaloguj (vysledek.chyba);
...
}
Zobrazeno 9 zpráv z 9.