pouze 2 stavy: OK/ERROR. To ze "ERROR" v sobe obsahuje bazilion ruznych chyb je v tomto pripade mozne ignorovat. Podstatne je pouze osetrit CELY stavovy prostor - jak detailne uz zavisi na tom, co od aplikace ocekavame.
S timto pristupem neni reseni chyb nijak komplikovane ani s chybovymi kody.
Znám spoustu programů, které, když se jim něco nelíbí, tak napíšou "ERROR" a skončí.
Ja znam spousti lidi co maji bradavici na nose. Jak to souvisi s vyjimkami a errorkody? Nijak. Stejne jako Vase vyjadreni ze nejake programy co znate napisi "ERROR".
Takove objekty musi mit jasne definovane rozhrani - a tedy zpusob jak zjistit zda selhaly (a opet je jedno jestli nejakym try/catch nebo osetrenim errorcodu). Ve vetsine pripadu staci brat opet pouze 2 stavy - externi objekt selhal, nebo neselhal. Osetreni opet trivialni.
Samozřejmě, že je ošetření trivální. ERROR 
Ne, osetreni neni "ERROR", ale nekolik "nadstavu", ktere pokryvaji mnozinu VSECH stavu. Ano, je mozne mit pouze dva "nadstavy": OK a ERROR.
Vidíte! A ony přesně výjimky takhle fungují. Jediný co mají navíc je to, že nemusíte psát kolem volání IFy
Pane Novak. Ja VIM jak funguji vyjimky. Chapu ze jste podeziravy, ale dokazete pripustit, ze chapu vyjimky v C++, v Jave, v C#, v Pythonu, delal jsem i s "vyjimkami" v CLOS, s Exception monad-ami v haskellu.
Chapu koncept vyjimek v C++. Zkuste predstirat, ze mi verite.
Proč teda vy lidi máte takovou averzi vůči výjimkám, když jde jen o syntax-suggar?
"My lidi" - to nevim koho myslite. Ale ja, clovek, k tomu mam averzi proto, ze vyjimky (v C++!! a podobnych jazycich - nemam nic proti CLOS vyjimkam nebo "vyjimkam" realizovanym pres monady v haskellu) jsou syntax-suggar, ktery usnadnuje psani spatne osetreni chybovych stavu. Tj. umoznuje psat kod, ktery VYPADA, ze je na prvni pohled cisty, krasny, jasny, ale ve skutecnosti muze byt semeniste prasaren, segfaultu a jinych radosti.
Pro ujasneni - netvrdim, ze vyjimky jsou NAPROSTO SPATNE - tvrdim, ze SPRAVNE osetrovani chybovych stavu pouzivanim vyjimek v C++ je MNOHEM SLOZITEJSI, NEZ TO VYPADA, a proto ho vetsina lidi udela SPATNE.
Výhodou výjimek je to, že fungují stejně třeba i ve Windows, kde není glib a ani GError
Prosim, budte tak laskav a neco si o glib zjistete. Jedna z hlavnich vyhod pro glib (a proc ji pouzivame), je to, ze je EXTREMNE dobre prenositelna mezi platformami - tj. na windows bezi uplne stejne dobre jako na linuxu. Je to normalni C knihovna. Dokonce nepotrebuje ani gcc.
Tj. nemate pravdu, glib s GErrorem je VSUDE, kde je C kompilator.
2) rucne v jednom enum-u v jednom globalnim hlavickovem souboru pro chyby (idealne automaticky generovanem z nejakeho textaku kde je k chybe doplnen i jeji lokalizovatelny textovy popis)
Globální hlavičkový soubor... vy asi nepíšete knihovny?
Jisteze pisi. Soubor je "globalni v ramci jedne nebo vice knihoven", stejne jako je "globalni" treba errno.h.
Opet bych Vas poprosil, abyste zkusil argumentovat fakty, a ne neustalym naznacovanim ze "nic neumim a nicemu nerozumim".
3) "neresim" - kazdy "modul" (napr. foo.c, foo.h) ma sve errorkody s prefixem "ERROR_FOO_" - jejich skutecna integer hodnota nemusi byt nijak unikatni, protoze selhani modulu "foo" musi resit kod, ktery ho vola a protoze "foo" muze vratit pouze "ERROR_FOO_*" kody, neni zadny duvod pro jejich unikatnost.
A z modulu FOO vyhodíte chybu do modulu BAR tak že nadefinujete proměnnou ERROR_BAR_ERROR_IN_FOO a tu zareportujete ven. Co se vlastně ve FOO stalo, to už se nikdo nedozví. Když to neuděláte vy, tak to udělá váš nějaký méně zdatný kolega. Nebo to udělá proto, že mu na vývoj modulu nadřizený přidělil málo času (pak je 1000x lepší, když vylítne výjimka přímoz FOO, než když ji někdo zahodí a vyhodí obecnou chybu)
V BAR zavolam FOO a ten vrati ERROR_FOO_*, tato chyba se zaloguje (tj. co se stalo ve FOO se dozvi kdokoliv, kdo se koukne do logu) a na zaklade hodnoty chyby vyberu co dal delat, a protoze, jak jsem psal o zabalovani chyb/vyjimek, vratim chybu, ktera ma VYZNAM v kontextu BAR. tj. tam kde puvodni chyba byla ERROR_FOO_DISK_FULL muzu vratit treba ERROR_BAR_STORAGE_FULL..
Mimochodem neco podobneho jsem pouzil jen nekolikrat, vzdy u dost malych knihoven, kde by pouziti glib a GError byla zbytecne "velka" zavislost. Klicove slovo je "dost malych". Pokud je kod maly, dostatecne jasne definovano co ma delat, neni toto schema (i kdybych pripustil vase ERROR_BAR_IN_FOO "retezeni") nijak problematicke.
To je asi jakoby Vam Firefox pri nezdarenem pokusu o otevreni stranky vypsal HTTP odpoved, TCP/IP packety, ethernetove pakety, atd, atd.
Co myslíte, jak mi je, když mi Firefox napíše, že "Stránka se nedá zobrazit" (aby třeba k tomu dodal, že DNS jméno neexistuje, nebo že selhalo spojení, což mi třeba napoví, že jméno mám správně, ale blbec jsem si nohou vykopnul kabel z ethernetu)
Ano, firefox Vam napovi, ale pouze z VELMI OMEZENEHO mnozstvi chybovych stavu - coz je presne to o cem mluvim - firefox Vam nenahlasi KAZDOU MOZNOU CHYBU - pouze nekolik, ktere si podle vyvojaru zaslouzi vlastni "kategorii". Pro vsechno ostatni bude "selhalo spojeni". Coz, jak rikate "napovi", nicmene se jedna o to, o cem mluvim ja - "zabaleni" vyjimky - firefox Vam nepovi o tom, jaky errorcode vratil "socket", nerekne vam na jake pozici doslo ke korupci paketu. Napise "selhalo spojeni", protoze to je ta "zabalena" chyba/vyjimka. Natoz aby Vam rekl ze jste blbec a ze jste si vykopnul kabel.
Coz souvisi s tim cemu se obcas rika "leaky abstraction" - proste kazda vyssi vrstva je ve vetsine pripadu nucena provest nejake "zobecneni" urcitych chybovych stavu pod jednu "strechu". Pak NENI mozne bez dalsich nastroju zjistit, kde k chybe doslo. To je ale normalni, a je to v poradku. Firefox nema slouzit jako diagnostika site. Na to jsou jine nastroje.
pouze jeden chybovy stav pro selhavsi "fopen" - neco ve stylu: ERROR_CONFIG_OPEN("Couldn't open configuration file myapp.cfg"). Presny errorcode proc "fopen" selhal neni nutne uvadet.
Opět jeden příklad z praxe. Neustále to hlásilo, že to nemůže otevřít nějaké datové soubory. Dokonce někoho chytrého napadlo, že by bylo dobré uživateli napovědět, co má dělat. Ať si prý zkontroluje, zda tam ty soubory jsou. No byly tam, ale program stále tvrdil, že tam nejsou. Až po podrobném prozkoumání problému pomocí strace se ukázalo, důvodem, proč to nejde je chyba "Access Denied". Po úpravě přístupových práv k těm souborům se to už rozběhlo. Jistě, že to někoho mohlo napadnout předtím, ale nenapadlo... celé odpoledne zabyté jen tím, že autor programu měl podobný názor jako vy.
NE, pletete si priklad s pristupem.
K prikladu - ano, to je bezne, a napr. me by nenapadlo "podrobne zkoumat problem pomoci strace", protoze vim ze duvodu, proc NEJDE OTEVRIT soubor, je nekolik, a chybejici prava je asi druhy, ktery bych zjistoval
K pristupu:
Ja jsem explicitne napsal (v te casti, kterou jste se rozhodl necitovat), ze pokud MA SMYSL DALSI CHYBOVY STAV Z HLEDISKA APLIKACE, tak se samozrejme prida i dalsi chybovy stav. Vase argumentace je zalozena na tom, ze jsem v prikladu, ukazujicim redukci vsech moznych stavu na STAVY VYZNAMNE PRO APLIKACI, pouzil ZAMERNE ZJEDNODUSENI.
Protoze jinak se jedne presne o to same, jako priklad s Firefoxem a vypadlym kabelem. Firefox Vam TAKE nerekne, ze vypadl kabel (i kdyz eth karta to vi!!), ale ze nemuze navazat spojeni.
Pane Novak, nechci Vas nebudu obvinovat z neznalosti, nedostatecnych "1337 skillz", nebo podobne. Ale ja jsem v C delal uz na 3 netrivialnich projektech, a vetsinu Vasich namitek co "nejde" bez vyjimek, jsem mnohokrat a bez vetsich problemu resil.
Ale tim, ze "predpokladate", ze to v C nejde (protoze delate v C++), se stavite presne do te pozice cloveka, ktery neco nezna, nepouziva to, ale je presvedcen ze o tom vse vi a vi proc je to spatne a proc je to co pouziva on lepsi.
Jen 3?

Ano, jen 3. Projekt se navrhne, napise, odladi, spusti a udrzuje. Klicove slovicko, ktere jste zjevne zamerne ignoroval je "netrivialni". Napiste mi prosim, na kolika netrivialnich projektech (rekneme nad 50 000 radek), v C (ne C++) jste se podilel Vy.