C++ a výjimka v destruktoru

Sten

Re:C++ a výjimka v destruktoru
« Odpověď #90 kdy: 06. 02. 2014, 17:53:54 »
Nikoliv, autopilot se vypne (bez výjimky), to je normální stav.

Jistě, ono je úplně normální, když se něco jen tak samo vypne a spustí to alarm. Nicméně vás chápu. Kdybyste totiž tohle řešil výjimkou (protože jde o výjimku, autopilot se ukončuje, protože to nezvládá, ne protože mu to řekl uživatel), nemohl byste vymýšlet tyhle komplikace :)

V destruktoru klapek vznikne výjimka "nemůžu nastavit klapky" a poté vznikne v destruktoru výškovky výjimka "nemůžu nastavit výškovku". Pilot se dozví, že má blbě klapky, ale už se nedozví, že mu letadlo padá kvůli blbě nastavené výškovce. Jestli to přežije, tak bude proklínat programátora, který si myslí, že vyhazovat výjimky v destruktoru je v pohodě.

V tom případě by měl destruktor autopilota vyhodit výjimku, že se nepodařilo nastavit původní stav, a případně tam přidat ty výjimky, co vyletěly. Něco jako dělá Java.


Re:C++ a výjimka v destruktoru
« Odpověď #91 kdy: 06. 02. 2014, 18:03:21 »


V tom případě by měl destruktor autopilota vyhodit výjimku, že se nepodařilo nastavit původní stav, a případně tam přidat ty výjimky, co vyletěly. Něco jako dělá Java.

Dik, ted me napadlo, jak tohle realizovat v LightSpeed::Exception. Uz vim co narvat do vetve kdyz std::uncaught_exception je true. Podminkou akorat bude, ze vyjimka dedi std::exception

Ivorne

Re:C++ a výjimka v destruktoru
« Odpověď #92 kdy: 06. 02. 2014, 20:50:58 »
Já tedy zastávám názor, že výjimky obecně nejsou vhodné při snaze o vysokou odolnost proti chybám.

sobol

Re:C++ a výjimka v destruktoru
« Odpověď #93 kdy: 06. 02. 2014, 20:51:46 »
Takovy flame, lidi jste silenci.:-)

Ivorne

Re:C++ a výjimka v destruktoru
« Odpověď #94 kdy: 06. 02. 2014, 21:09:19 »
Takovy flame, lidi jste silenci.:-)

Tak ale je to poučný, docela rád jsem si to pročetl.


RAII

Re:C++ a výjimka v destruktoru
« Odpověď #95 kdy: 06. 02. 2014, 21:22:08 »
No sakra, exception v DESTRUKTORU?? V C++ ? Todle si dělej v ňáký blbý javě nebo C#. TODLE je C++, v C++ se používá RAII, žádný GC který po tobě uklidí bordel za cenu cenného výkonu (GC je pro idioty, jen můj názor). Tím že pokurvíš destruktor výjimkou jdeš přímo proti principu RAII.
Destruktor prostě nesmí nikdy selhat, jinak ti utečou zabrané prostředky objektem (hmm exception se ti vyvolá při stack unwindingu a nebo když se dostane objekt out of scope... HMM ?). Kam asi ta výjimka propadne, někam dolu ... TAK MI PAK vysvětli jakou
hrůzou chceš tendle chaos napravit. Pokud potřebuješ exception v destruktoru, špatně si navrhl program a nebo si debil.

Trollslayer

Re:C++ a výjimka v destruktoru
« Odpověď #96 kdy: 06. 02. 2014, 21:42:46 »


trollove si vsimli nove diskuze. To brzo. Vsechno uz bylo popsano od tretiho prispevku dale. Staci cist.

Re:C++ a výjimka v destruktoru
« Odpověď #97 kdy: 06. 02. 2014, 23:13:55 »
Já tedy zastávám názor, že výjimky obecně nejsou vhodné při snaze o vysokou odolnost proti chybám.

Naopak, stabilita mých aplikací výrazně stoupla, zejména serverů. Na každou vyhozenou výjimku někde čeká handler, který v nejhorším případě vrátí klientoví 500 Internal Server Error. Je to sice otrava (pro klienta), ale server se nesloží

gamer

Re:C++ a výjimka v destruktoru
« Odpověď #98 kdy: 06. 02. 2014, 23:36:00 »
Naopak, stabilita mých aplikací výrazně stoupla, zejména serverů. Na každou vyhozenou výjimku někde čeká handler, který v nejhorším případě vrátí klientoví 500 Internal Server Error. Je to sice otrava (pro klienta), ale server se nesloží

Tak to je super, klient nedostal to co chtěl, aplikace z jeho pohledu vůbec nefunguje, ale stabilita stoupla ;). A teď si představte, že klientem Vaší aplikace nebude Franta Surfař, ale pilot letadla, který dostane hlášku 500 Internal Aircraft Error. Tady by je z Vašich aplikací trefil šlak http://www.faa.gov/, ale naštěstí by ty Vaše výtvory nepřošly certifikací.

Re:C++ a výjimka v destruktoru
« Odpověď #99 kdy: 07. 02. 2014, 00:27:35 »
Tak to je super, klient nedostal to co chtěl, aplikace z jeho pohledu vůbec nefunguje, ale stabilita stoupla ;). A teď si představte, že klientem Vaší aplikace nebude Franta Surfař, ale pilot letadla, který dostane hlášku 500 Internal Aircraft Error. Tady by je z Vašich aplikací trefil šlak http://www.faa.gov/, ale naštěstí by ty Vaše výtvory nepřošly certifikací.

Že tě to baví neustále trollovat. Považ, že na server chodí stovky až tisíce requestů za sekundu od zhruba stejného počtu userů. Takovej SIGSEGV nebo SIGABORT by nepotěšilo mnohem víc klientů, než jednoho s pětistovkou. Ale bohužel na světě je hodně takových jako jsi ty, co to nechápou

aaasss

Re:C++ a výjimka v destruktoru
« Odpověď #100 kdy: 07. 02. 2014, 01:15:21 »
Naopak, stabilita mých aplikací výrazně stoupla, zejména serverů. Na každou vyhozenou výjimku někde čeká handler, který v nejhorším případě vrátí klientoví 500 Internal Server Error. Je to sice otrava (pro klienta), ale server se nesloží
A preco by sa mal server zlozit, ked nieco nefunguje? Pri chybe nie je vzdy nutne vyhadzovat vynimku - vsak su aj Cckoidne riesenia chyby. Niekedy staci goto, inokedy je mozne vratit chybovy stav (ci uz hnusne cez zdielanu premennu - errno) alebo navratovou hodnotou alebo ulozenie niecoho na pointer dodany v parametroch.

Já tedy zastávám názor, že výjimky obecně nejsou vhodné při snaze o vysokou odolnost proti chybám.
V C++ asi mate pravdu - niekto nieco neodchyti a dopadne to zle. V Jave su na toto checked exceptions, ktore uzivatela nutia zohladnit vynimku.

Pri snahe o odolnost voci chybam sa niekedy hodi prinutit programatora, aby premennu pouzil - potom uz tak nepochybuje o tom, ci ju je treba naozaj pouzivat a testovat.
Neodolne voci chybam je nieco, co sa vola
Kód: [Vybrat]
int errno = action();
Odolnejsie voci chybam je volanie ako
Kód: [Vybrat]
action(&errno);

Re:C++ a výjimka v destruktoru
« Odpověď #101 kdy: 07. 02. 2014, 02:18:46 »
A preco by sa mal server zlozit, ked nieco nefunguje? Pri chybe nie je vzdy nutne vyhadzovat vynimku - vsak su aj Cckoidne riesenia chyby. Niekedy staci goto, inokedy je mozne vratit chybovy stav (ci uz hnusne cez zdielanu premennu - errno) alebo navratovou hodnotou alebo ulozenie niecoho na pointer dodany v parametroch.

protože
Kód: [Vybrat]

void readPage(Request *r) {
    char buffer[1000];
    FILE *f = fopen(r->pathname,"r");
    int i = fread(buffer, 1000,1,f);   //crash SIGSEGV
   //...
    fclose(f);

}

ale

Kód: [Vybrat]

void readPage(Request *r) {
    char buffer[1000];
    FileStream f(r->pathname); //exception - FileNotFound exception
    int i = f.read(buffer, 1000); 
   //...

}

... {
    try {
       readPage(r);
   } catch (FileNotFoundException &e) {
       errorPage(404);
   } catch (...) {
       errorPage(500);
   }
}

Jasně, Cckové řešení vyžaduje ošetřit návratovou hodnotu z fopen. A pak nějak vrátit chybový kód tomu volajícímu. Výjimka takové povinnosti eliminuje. Ať už funkce readPage dělá cokoliv (může být abstraktní, implementovaná v potomkovi), pokud vyhodí FileNotFoundException, pošlu na výstup status 404 Not found. Všimněte si také, že výjimkové řešení bude o několik řádek kratší. A v neposledním případě, výjimkové řešení je rychlejší, protože kód neobsahuje zbytečné testy na každém rozcestí, obsahuje jen vyhodnocení místě vzniku chyby a pak vyhodnocení při výjimce. Výjimky se totiž řeší bokem, mimo hlavní kód... tedy vrací se jinou cestou, než původní kód.

gamer

Re:C++ a výjimka v destruktoru
« Odpověď #102 kdy: 07. 02. 2014, 04:28:16 »
Že tě to baví neustále trollovat. Považ, že na server chodí stovky až tisíce requestů za sekundu od zhruba stejného počtu userů. Takovej SIGSEGV nebo SIGABORT by nepotěšilo mnohem víc klientů, než jednoho s pětistovkou. Ale bohužel na světě je hodně takových jako jsi ty, co to nechápou

Troluješ ty, SIGSEGV nebo 500 vyjde pro uživatele úplně nastejno a když na serveru spadne worker, vyspawnuje se místo něho nový, takže to postihne taky jednoho uživatele. Mimochodem cílem by nemělo být "nějak to zbastlíme a když občas někdo dostane 500, tak je to jedno, ve statistiká se to přece ztratí", ale "vytvoříme robustní řešení schopné definovaně ošetřit a reportovat chybové stavy (i více, ne jen první)".

Re:C++ a výjimka v destruktoru
« Odpověď #103 kdy: 07. 02. 2014, 07:15:27 »


Troluješ ty, SIGSEGV nebo 500 vyjde pro uživatele úplně nastejno a když na serveru spadne worker, vyspawnuje se místo něho nový, takže to postihne taky jednoho uživatele. Mimochodem cílem by nemělo být "nějak to zbastlíme a když občas někdo dostane 500, tak je to jedno, ve statistiká se to přece ztratí", ale "vytvoříme robustní řešení schopné definovaně ošetřit a reportovat chybové stavy (i více, ne jen první)".

Prefork patri do minuleho stoleti. Dneska jsou servery threadove. Jejich nevyhodou je, ze kdyz spadne jeden thread, vezme s sebou ostatni. Vyhodou naopak je vyssi rychlost (razeni vlaken je snazsi nez procesu) a takova kompaktnost aplikace, jako ze jednotliva vlakna mohou sdilet data, mohou snadno spoustet a ridit joby a podobne. Klade to vyssi naroky na stabilitu cele aplikace, tedy aby kazdy problem byl osetren a zareportovan, protoze sestreleni threadoveho serveru muze byt dost fatalni.

Sorry ale navrhovat servery s tim, ze kdyz to spadne vyspawnujeme novyho workera neni hodne profesionalna.

gamer

Re:C++ a výjimka v destruktoru
« Odpověď #104 kdy: 07. 02. 2014, 09:23:34 »
Prefork patri do minuleho stoleti. Dneska jsou servery threadove. Jejich nevyhodou je, ze kdyz spadne jeden thread, vezme s sebou ostatni. Vyhodou naopak je vyssi rychlost (razeni vlaken je snazsi nez procesu) a takova kompaktnost aplikace, jako ze jednotliva vlakna mohou sdilet data, mohou snadno spoustet a ridit joby a podobne. Klade to vyssi naroky na stabilitu cele aplikace, tedy aby kazdy problem byl osetren a zareportovan, protoze sestreleni threadoveho serveru muze byt dost fatalni.

Sorry ale navrhovat servery s tim, ze kdyz to spadne vyspawnujeme novyho workera neni hodne profesionalna.
Ale houby, normálně se to dělá takhle:
http://httpd.apache.org/docs/2.2/mod/worker.html
Mám kontrolu nad tím, kolik je workerů a kolik je threadů. Když spadne worker, vezme s sebou všechny thready, takže to ovlivní jen ty uživatele, které worker zrovna obsluhuje, což je číslo menší nebo rovno počtu threadů na workera.

Citace
Sorry ale navrhovat servery s tim, ze kdyz to spadne vyspawnujeme novyho workera neni hodne profesionalna.
Sorry, ale navrhovat server s tím, že crash jednoho threadu mi shodí celý server, není hodné profesionála.