Diskuze: Return bool vs. Throw Exception

C# .NET .NET (C# a Visual Basic) Return bool vs. Throw Exception American English version English version

Avatar
Petr Nymsa
Redaktor
Avatar
Petr Nymsa:

Zdravím, občas přemýšlím co je z hlediska implementace lepší použít. Někdy mám například metodu která má něco provést, někdy metoda úlohu neprovede (například nejsou splněny všechny požadavky).
Je jasné, že pokud i uvnitř metody může dojít k výjimce, je lepší zachytit výjimku v té metodě a zpropagovat dál. Ale, občas jsme si 99% jistí, že v dané metodě k výjimce nedojde, pouze se úkon provede nebo provede. Není po tom jednodušší aby metoda vracela BOOL, tedy TRUE = vše proběhlo v pořádku, FALSE = neproběhlo v pořádku, ale mě je jasné proč (v metodě se dělá například jenom jeden úkon).

Zpravidla používám vždy výjimky, ale chci se takhle zeptat, vždy výjimky nebo někdy "jednodušší" způsob pouhým vrácením BOOL ?

Odpovědět 30.11.2013 13:26
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na Petr Nymsa
Zdeněk Pavlátka:

bool se vracelo v jazyce C. :D Ale u spousty metod se vyplatí bool více(rychlost, přehlednost) - např tryParse...

Nahoru Odpovědět 30.11.2013 13:33
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Petr Nymsa
Kit:

Výjimky se v zásadě používají vždy, pokud je něco špatně, i kdyby to mělo být v polovině případů. Pokud selže připojení k databázi, je to výjimka. Pokud je chyba v SQL dotazu, je to výjimka. Pokud někdo ve formuláři místo čísla domu napíše ulici, je to také výjimka.

Naopak se výjimky nemají používat k řízení toku programu. Ukončovat cyklus nebo metodu výjimkou, když vše proběhlo OK, se prostě nemá. Pokud proces proběhne přesně tak jak má, nikdy by k vyhození výjimky nemělo dojít.

Nahoru Odpovědět 30.11.2013 13:40
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na Zdeněk Pavlátka
Petr Nymsa:

Mě je jasný že Výjimky je lepší způsob, ale občas mě přijde že pouhé vracení bool je přehlednější, sám jak říkáš, třeba tryParse

Nahoru Odpovědět 30.11.2013 13:40
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Jan Vargovský
Redaktor
Avatar
 
Nahoru Odpovědět 30.11.2013 13:42
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na Kit
Petr Nymsa:

Jasný :) A co například použití v této situaci.
metoda načítá data (metoda jménem NactiData) například ze souboru. Uvnitř NactiData mám Try/Catch blok ale zvenku, tedy kde metodu volám, chci vědět pouze jestli se načetlo či ne (true / false). Je lepší výjimku z metody NactiData zpropagovat dál, nebo aby vracela bool ?

Nahoru Odpovědět 30.11.2013 13:49
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Drahomír Hanák
Tým ITnetwork
Avatar
Odpovídá na Petr Nymsa
Drahomír Hanák:

Obvykle když načítám data, chci ta data. Pokud se nenačtou, tak je to prostě chyba. Nenapadá mě teď situace, kdy bych potřeboval načítat něco, co vlastně nechci. Jinak by se tedy vracel boolean, ale rozhodně bych metodu v tomhle případě nepojmenoval NactiData.

 
Nahoru Odpovědět  +2 30.11.2013 13:54
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na Petr Nymsa
Zdeněk Pavlátka:

Já mám radši bool - takže bych ho určitě použil.

Nahoru Odpovědět 30.11.2013 13:54
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Petr Nymsa
Kit:

V tomto případě je zpravidla lepší tu výjimku v metodě vůbec nezachytávat a vypropagovat ji ven. Získáš tím i důvod, proč se data nenačetla a můžeš ho ze všech možných výjimek zachytit jedním catch a zalogovat nebo vypsat v dialogovém okně.

Výhodou je, že po návratu z metody, která může selhat, nemusíš vůbec nic testovat. Ani ten bool, ani výjimku. Tu si můžeš ošetřit klidně o pár úrovní výš. Aplikace se tím hodně zjednoduší.

Nahoru Odpovědět  +1 30.11.2013 13:58
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na Drahomír Hanák
Petr Nymsa:

Mám to ve Wrapperu, tedy takový Manager, který data drží a já pouze chci pouze říct, ať teď ty data načte. Manager mi ty data drží, umí je načíst i uložit. Takže ta metoda mi data nevrací, pouze říká a teď ty data načti. Tím pádem mě spíše zajímá akorát jestli se mu data podařila načíst.

Nahoru Odpovědět 30.11.2013 13:59
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Odpovídá na Petr Nymsa
Jakub Lásko[Saarix]:

Toť otázka :-) asi bych tady neviděl problém v použití bool, pokud prakticky řešíš jen zda se data načetla či ne. Možná ale pokud budeš zohledňovat nějaký jiný postup u toho, když by ti NactiData třeba vyhodilo chybu soubor neexistuje (zdroj), tak pak je asi na zvážení, zda u této chyby nějak jinak zakročíš.
Pokud ne, tak je asi určitě lepší použít bool.

Editováno 30.11.2013 14:03
Nahoru Odpovědět 30.11.2013 14:02
Časem je vše možné.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Petr Nymsa
Kit:

Jenže tebe nezajímá, jestli se data podařilo načíst. Dal jsi metodě rozkaz a ten musí splnit. Pokud ho nesplní, je to výjimka.

Nahoru Odpovědět 30.11.2013 14:02
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na Kit
Petr Nymsa:

Hmm, to je právě co občas řeším :). Ale z 90% výjimky používám. Takže asi i zde bude lepší výjimku zpracovat.

Nahoru Odpovědět 30.11.2013 14:04
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Kit
Redaktor
Avatar
Odpovídá na Jakub Lásko[Saarix]
Kit:

Jenže výsledek toho bool musí zbytečně testovat a musí na výsledek nějak reagovat. To jen znepřehlední aplikaci.

Nahoru Odpovědět 30.11.2013 14:05
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Theodor Johnson
Redaktor
Avatar
Odpovídá na Petr Nymsa
Theodor Johnson:

Nemusíš nutně vracet bool, můžeš přeci rovnou vrátit zprávu s chybou a testovat ji na hodnotu null

Nahoru Odpovědět  -2 30.11.2013 14:15
Přecházím na "Cross-Platform Development"
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Petr Nymsa
David Čápka:

Všechny chyby bys měl řešit přes výjimky, protože od toho v jazyce jsou. Koukni se na PHP, je tam vidět, co se stane, když se míchá výstup s chybovou hodnotou.

Nahoru Odpovědět  -1 30.11.2013 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
Petr Nymsa
Redaktor
Avatar
Odpovídá na David Čápka
Petr Nymsa:

Dobrá, přesvědčili jste mě úplně :)

Nahoru Odpovědět 30.11.2013 14:18
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Kit
Redaktor
Avatar
Odpovídá na Theodor Johnson
Kit:

Pokud metoda vrátí null, proběhla OK? To bych ještě překousl, ale nepřekousnu, když dostanu hlášení o chybě datovým informačním kanálem místo chybového. Víš, jak blbě se to pak dál zpracovává?

Nahoru Odpovědět 30.11.2013 14:23
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Theodor Johnson
Redaktor
Avatar
Odpovídá na Kit
Theodor Johnson:

Nevím jak těžký je pro tebe zpracovat instanci Systém.Exception

Nahoru Odpovědět 30.11.2013 14:38
Přecházím na "Cross-Platform Development"
Avatar
Kit
Redaktor
Avatar
Odpovídá na Theodor Johnson
Kit:

Když už mám výjimku, tak nemusím zpracovávat žádný boolean či null.

Nahoru Odpovědět 30.11.2013 14:45
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Theodor Johnson
Redaktor
Avatar
Odpovídá na Kit
Theodor Johnson:

V tom s tebou souhlasím, já jsem měl na mysli spíš návratovou hodnotu metody

Nahoru Odpovědět 30.11.2013 14:51
Přecházím na "Cross-Platform Development"
Avatar
Kit
Redaktor
Avatar
Odpovídá na Theodor Johnson
Kit:

Může být klidně void.

Nahoru Odpovědět 30.11.2013 15:34
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
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 22 zpráv z 22.