Autor Zpráva
Jirik1
Profil *
Učím se OOP a hodně jsem toho zatím pochopil. Číst kódy v Nette mi nedělá žádné problémy, ale přiznám se, že občas to stojí za to. Pořád nemůžu pochopit, co dělá "throw".
Nevíte? Byl bych moc rád :-). Díky.
pcmanik
Profil
Jirik1:
Skúšal si sa pozrieť do dokumentácie?
Jirik1
Profil *
Já to z toho nemůžu vyčíst :-).
Joker
Profil
Trochu na ten článek viz [#2] sice v dokumentaci PHP odkazuje heslo „throw“ , nicméně se tam nepíše, co vlastně throw dělá.

Takže: throw vyhodí výjimku, kterou pak lze zachytit pomocí catch.

Vysvětlení jak to asi funguje, byť ten článek je dost starý: www.interval.cz/clanky/oop-v-php-vyjimky-v-oop

PS.: Koukám, že základní kurz na Péhápku výjimky nějak vynechal.
Jirik1
Profil *
No, tak jsem to pochopil... akorát nevím na co mi ty výjimky budou :-)
Joker
Profil
Výjimky, jak už název napovídá, slouží k ošetření nestandardních situací.

Například mám funkci, která něco dělá a v případě chyby chce tu informaci o chybě nějak vrátit nadřízenému kódu.
Klasicky té funkci třeba dáte návratovou hodnotu boolean, true = OK a false = chyba.
Jenže často potřebujete přesnější informaci než „zpracování skončilo chybou“.

Tak funkce nebude vracet boolean, ale nějaký kód výsledku.
Problém nastává ve chvíli, kdy ta funkce má ještě vracet i nějaký výstup.
Objevují se věci jako „kladné číslo znamená výsledek, záporné číslo chybový kód“, nebo „vrací objekt XY, nebo chybový kód v případě chyby“, případně při chybě funkce vrátí třeba null a pak existuje nějaká funkce na způsob getError, přes kterou zjistíte k jaké chybě došlo.

Což už začíná být dost nepohodlné.
A ještě horší je, že máte kód, který něco volá, odtamtud se zase něco volá, a tak dále; Někde hluboko uvnitř nastane chyba, na které to musí celé spadnout a potřebujete tu chybu dostat až nahoru a tam zpracovat.
Což znamená, že v té nejnižší úrovni tu chybu musíte nějak vrátit a pak si ji musí mezi sebou přehazovat všechny ty mezičlánky (které ta chyba vlastně nijak nezajímá, kromě toho, že ji předávají dál) až nahoru, kde se teprve zpracuje.

Tohle právě řeší výjimky.
Kcko
Profil
Joker:
Při vší úctě, jednoduchá ukázka by asi tazateli lépe pomohla pochopit než tuna textu, který bych musel i já číst asi 3x než bych pochopil co a jak ty výjimky fungují.
Kajman
Profil
Kcko:
Ukázky viděl v manuálu a píše, že to pochopil. Tento textový popis mi přijde dobrý k nástinu, k čemu to je dobré využívat.
Kcko
Profil
Kajman:
Přijde mi, že to právě moc nepochopil.
Moje reakce na Jokera neměla být nějak negativní, k obsáhlejšímu textu bych ještě přiložil nějaký jednoduchý příklad(y) demonstrující to co jsem napsal a bylo by myslím vše jasnější.
Joker
Profil
Kcko:
Při vší úctě, jednoduchá ukázka by asi tazateli lépe pomohla pochopit

Budu rád když někdo takovou ukázku vymyslí.

Jinak on píše, že pochopil jak to funguje, ale nepochopil k čemu je to dobré.
Na to jsem spatra výstižnou jednoduchou ukázku nevymyslel.
Plán byl to popsat a dát nějaký ukázkový příklad, vzhledem k časovým možnostem to nakonec skončilo jen u popisu.

Problém s jednoduchou ukázkou „K čemu jsou výjimky“ je, že na jednoduché ukázce často výjimky vypadají jako zbytečnost.

Když vezmu jednoduchý příklad na výjimku (trochu upravený z manuálu PHP):
function inverse($x) {
    if (!$x) {
        throw new MyException('Division by zero.');
    }
    return 1/$x;
}
// Výkonný kód
try {
  $input = 5; // nějaký vstup
  echo "Převrácená hodnota je: " . inverse($input);
} catch (MyException $e) {
  echo "Výpočet převrácené hodnoty skončil chybou!";
}

Analogicky bez použití výjimek:
function inverse($x) {
    return $x ? (1 / $x) : false;
}
// Výkonný kód
$input = 5; // nějaký vstup
$result = inverse($input);
echo ($result === false) ? "Výpočet převrácené hodnoty skončil chybou!" : ("Převrácená hodnota je: " . $result);

Na tom přínosy výjimek zrovna moc nevyniknou.
Jirik1
Profil *
Husté vlákno... Fakt moc díky, jsem pochopil výjimky.

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