Avatar
pcrewik
Člen
Avatar
pcrewik:

Ahojte,
viete mi pls. povedať ako je správne ošetrovať výnimky, tak aby keď spravím povedzme knižničnú funkciu ktorá vyhadzuje výnimky, vedel programátor ktorý ju volá, že má daný typ výnimky zachytávať.

V jave to tuším funguje tak, že ak funkcia vyhadzuje výnimku tak jej volanie musí byť v try bloku, ale v c++ to tak nie je, alebo?
Prípadne nejakú dobrú literatúru ako správne navrhovať vyhadzovanie výnimiek?

 
Odpovědět 8. srpna 13:49
Avatar
pcrewik
Člen
Avatar
Odpovídá na pcrewik
pcrewik:

napríklad v jave je možnosť bud funkcia má priamo za nazvom funkcie "throws NazovVynimky" alebo tuto vynimku obalíme do try-catch bloku.
V c++ máme try-catch blok, ale ako spravit "throws NazovVynimky"? Aby ten kto volá funkciu vedel, že môže dostať výnimku.

Editováno 8. srpna 15:29
 
Nahoru Odpovědět 8. srpna 15:28
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na pcrewik
patrik.valkovic:

Ve starších verzích C++ můžeš (podobně jako v Javě), za funkci umístit throw(). Tím řekneš, že tato funkce může vyvolat jakou výjimku. Problém je, že to kompiler nemůže zkontrolovat (funkce je definovaná až dále). Proto je throw v signatuře funkce od C++11 označené jako deprecated. Stačí používat doxygen dokumentaci a informace o tom, jakou výjimku funkce vyhazuje, zapsat tam.
https://www.stack.nl/…ommands.html#…

Nahoru Odpovědět  +1 8. srpna 15:40
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
pcrewik
Člen
Avatar
Odpovídá na patrik.valkovic
pcrewik:

ďakujem,
doxygen vyzerá celkom fajn, avšak, je to niečo čo nie je súčasťou jazyka a preto mi to pripadá trochu nesystematické riešenie problému. Ak chápeš čo myslím. Ide o to ako to vyriešiť napríklad bez toho doxygen-u. A navyše, zrejme to na rozdiel od javy, automaticky nevyhodí compile-time chybu ale programátor by si toho musel všimnúť v dokumentácií.

 
Nahoru Odpovědět 8. srpna 15:59
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na pcrewik
patrik.valkovic:

Jenže to v C++ dost dobře nejde. Podívej se na článek, co jsem psal o kompilaci. Kompilátor jde skutečně striktně shora dolů. Má to sice spíše historické důvody, protože dnešní stroje by to utáhly, ale stále se toto pravidlo udržuje. To znamená, že kompiler vždy přijde k definici metody před její implementaci, vždy. V tu chvíli tedy nemůže vědět, co daná funkce vyhazuje, a zda je tedy podmínka splněna. Nemluvě o případě, kdy voláš jinou funkci. Java čte zdrojový soubor jiným způsobem (proto mohou být metody použity ještě před implementací). V C++ tohle prostě dost dobře není možné.

Co se týče systematičnosti, upřímně (právě v Javě), mě zapisování výjimek u každé metody pěkně se**. Většina dnešních IDE ti současně k napovídání vypíšou i dokumentaci, kde už je napsáno, co funkce vyhazuje.

http://i.stack.imgur.com/WrwXR.png (tohle je C#, v C++ to funguje naprosto stejně).

Nahoru Odpovědět  +2 8. srpna 18:58
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
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 5 zpráv z 5.