Diskuze: c++ vyhadozvanie vynimky architektura

C a C++ C a C++ c++ vyhadozvanie vynimky architektura

Aktivity (1)
Avatar
pcrewik
Člen
Avatar
pcrewik:8.8.2016 13:49

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.8.2016 13:49
Avatar
pcrewik
Člen
Avatar
Odpovídá na pcrewik
pcrewik:8.8.2016 15:28

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.8.2016 15:29
 
Nahoru Odpovědět 8.8.2016 15:28
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na pcrewik
patrik.valkovic:8.8.2016 15:40

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.8.2016 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:8.8.2016 15:59

ď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.8.2016 15:59
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na pcrewik
patrik.valkovic:8.8.2016 18:58

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.8.2016 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.