Exceptions - ЗА и ПРОТИВ
58 отговора
1952 прегледа
Exceptions - ЗА и ПРОТИВ
А какво ще кажете за изказването на Joel за exceptions?
[линк]
Накратко - е не ги обича човека - и това е!
[линк]
Накратко - е не ги обича човека - и това е!
Re: Exceptions - ЗА и ПРОТИВ
Ima nesto viarno v tova koeto e kazal. Naistina bezrazbornoto izpolzvane na exception-i moze do dovede do po-goliam bardak otkolkoto da reshi problemi. No tova e drugata krainost na tova koeto toi predlaga, nikoga da ne se izpolzvat.
Krainostite nikoga ne vodiat do nisto hubavo.
I vse pak ima mesta kadeto exception-ite e po-dobre da ne se polzvat. Naistina predostaviat vazmoznosti za neochakvani greshki. Tipishen primer e constructor-a. Throw-vane na exception tam moze da dovede do nepredskazuemi rezultati. A kakvo s funkcia koito poluchava parameter ** ili &* i tazi promenliva ne se inicializira poneze predi tova niakoi e throw-nal exception(naprimer operator new) tia e neinicializirana i izpolzvaneto i e meko kazano opasno. A i samia operator new kakvo predpochitate, da varne 0 ili da throw-ne exception? Az lichno predpochitam 0 i da proveria. Da ne govorime che predi izvestno vreme niakoi C++ kompilatori ne pozvoliavaha exception da bade throw-nat v edin DLL i da bade cach-nat v drug ili v glavnata programa. Prosto v takav sluchai programata core-va. Java-ta opredeleno e reshila niakoi ot problemite, no i pri neia puk zaradi lipsata na macro-si e trudno da otpechatash saobstenieto za greshka. Kakto znaete v normalnite produkti e nuzno da ima trace level i prioritet na greshkite, koeto oznachava che ili imate funkcia koito izchisliava argumentite si i vatre proveriava dali saobstenieto da se otpechata (koeto vodi do malak no mnogo baven code a i e chista zaguba na vreme) ili v povecheto catch-ove triabva da raznesete switch(if) i tova se nalaga vinagi kogato vaznikne greshka. Drugia variant da rethrow-nete greshkata i da otpechatate saobstenieto vodi do zabludi za tova kade v deistvitelnost e vazniknala greshkata. Kato slozite na pochti vseki catch edin takav switch i programata stava meko kazano razvlechena, obemista i osobenno chetliva :)
Taka che vaprosa koga i kak triabva da se ipolzvat exeption-i e dosta slozen, az lichno gi polzvam, no izbiagvam da prekaliavam. V biblioteki kategorichno izbiagvam da izpolzvam exception-i v interface-nite funkcii. Tova si e opasno spored mene. Ako ne prehvanat exception-a izlitash do sledvastia ili do izhod-a ot programata. Tova za server-i pak e absolutno nedopustimo.
E tova e moe mnenie, ne kazvam che sam prav.
Krainostite nikoga ne vodiat do nisto hubavo.
I vse pak ima mesta kadeto exception-ite e po-dobre da ne se polzvat. Naistina predostaviat vazmoznosti za neochakvani greshki. Tipishen primer e constructor-a. Throw-vane na exception tam moze da dovede do nepredskazuemi rezultati. A kakvo s funkcia koito poluchava parameter ** ili &* i tazi promenliva ne se inicializira poneze predi tova niakoi e throw-nal exception(naprimer operator new) tia e neinicializirana i izpolzvaneto i e meko kazano opasno. A i samia operator new kakvo predpochitate, da varne 0 ili da throw-ne exception? Az lichno predpochitam 0 i da proveria. Da ne govorime che predi izvestno vreme niakoi C++ kompilatori ne pozvoliavaha exception da bade throw-nat v edin DLL i da bade cach-nat v drug ili v glavnata programa. Prosto v takav sluchai programata core-va. Java-ta opredeleno e reshila niakoi ot problemite, no i pri neia puk zaradi lipsata na macro-si e trudno da otpechatash saobstenieto za greshka. Kakto znaete v normalnite produkti e nuzno da ima trace level i prioritet na greshkite, koeto oznachava che ili imate funkcia koito izchisliava argumentite si i vatre proveriava dali saobstenieto da se otpechata (koeto vodi do malak no mnogo baven code a i e chista zaguba na vreme) ili v povecheto catch-ove triabva da raznesete switch(if) i tova se nalaga vinagi kogato vaznikne greshka. Drugia variant da rethrow-nete greshkata i da otpechatate saobstenieto vodi do zabludi za tova kade v deistvitelnost e vazniknala greshkata. Kato slozite na pochti vseki catch edin takav switch i programata stava meko kazano razvlechena, obemista i osobenno chetliva :)
Taka che vaprosa koga i kak triabva da se ipolzvat exeption-i e dosta slozen, az lichno gi polzvam, no izbiagvam da prekaliavam. V biblioteki kategorichno izbiagvam da izpolzvam exception-i v interface-nite funkcii. Tova si e opasno spored mene. Ako ne prehvanat exception-a izlitash do sledvastia ili do izhod-a ot programata. Tova za server-i pak e absolutno nedopustimo.
E tova e moe mnenie, ne kazvam che sam prav.
Re: Exceptions - ЗА и ПРОТИВ
ами аз ще отговоря също със статии и то от ключови фигури (сори за тъпия шаблон):
[линк]
[линк]
[линк]
[линк]
Re: Exceptions - ЗА и ПРОТИВ
Много зависи. Според мен exceptions трябва да се ползват умерено и там където трябва. За съжаление тук много зависи на какъв език пишеш. Лично аз доста пъти съм твърдял, че езика/фреймуърка нямат значение за добър програмист, но напоследък почвам да мисля, че това не се отнася примерно до Жаба. Примерно програмистите на Жаба са винаги по-дебели, по-тъпи и по-неясни за рабиране от останлите. Същото се отнася и за Жаба соурс - по-дебел (в пъти повече код), по-тъп, и по-неясен дори и от ауто-генериран Вижуал Бейсик от Студиото.
Та в Жаба трябва да кетчваш всеки ексепшън, който безумното вече Жаба АПИ реше да throw-не (ебаси АПИ-то е това, има повече deprecated methods отколкото актуални). Така се получава безумния Жабешки код:
try
{
Object.Method();
}
catch (StupidJavaException1 e1)
{
}
catch (StupidJavaException2 e2)
{
}
...
В 99.9% процента от случаите данните които се подават на функцията няма да предизвикат ексепшън и все пак трябва да ги кетчваш. Освен това, средния Жаба девелопер не е много интелигентен, и свиква на горния синтаксис и решава, че празен catch блок е нещо нормално. В следствие -- безумни и трудни за проследяване логически грешки и ужасен соурс.
Но има моменти когато е адски удобно. Затова лично мене повече ме кефи С++ (С#) подхода към ексепшъните -- има ги, но може да си ги ползваш само когато искаш и ако знаеш за какво става дума. Ако не те кефят и се кефиш на стил на програмиране ала 1975, заебаваш и не ги ползваш.
Та в Жаба трябва да кетчваш всеки ексепшън, който безумното вече Жаба АПИ реше да throw-не (ебаси АПИ-то е това, има повече deprecated methods отколкото актуални). Така се получава безумния Жабешки код:
try
{
Object.Method();
}
catch (StupidJavaException1 e1)
{
}
catch (StupidJavaException2 e2)
{
}
...
В 99.9% процента от случаите данните които се подават на функцията няма да предизвикат ексепшън и все пак трябва да ги кетчваш. Освен това, средния Жаба девелопер не е много интелигентен, и свиква на горния синтаксис и решава, че празен catch блок е нещо нормално. В следствие -- безумни и трудни за проследяване логически грешки и ужасен соурс.
Но има моменти когато е адски удобно. Затова лично мене повече ме кефи С++ (С#) подхода към ексепшъните -- има ги, но може да си ги ползваш само когато искаш и ако знаеш за какво става дума. Ако не те кефят и се кефиш на стил на програмиране ала 1975, заебаваш и не ги ползваш.
Re: Exceptions - ЗА и ПРОТИВ
Хубаво е да ги има.
За мързеливите прогърмисти, май е по-добре да няма задължителна обработка на изключения.
За тези дето им пука, е по-добре да има, защото компилатора ти казва, че може да се случи нещо грешно и е добре да го обработиш. На който му пука ги обработва. Който го мързи просто слага празна клауза и кашата става по-голяма. Ама на такива прогърмисти трябва да им режат топките.
Иначе в Джава когато пишеш библиотеки е много добра идея да хвърляш изключения от време на време. Примерно класическия пример, като метода ти получава аргумент и ти трябва да провериш този аргумент. Ако параметърът не отговаря на условията (примерно е нъл) хвърлящ едно изключение, в което обясняващ, че стойности нъл не се обработват и това е. Ако параметърът е валиден обработващ го и връщаш резултата. Ако това човек иска да го направи по-друг начи ще си отели вола от писане. Другия вариант е да не се прави нищо, ама така грешките се намират много трудно.
За мързеливите прогърмисти, май е по-добре да няма задължителна обработка на изключения.
За тези дето им пука, е по-добре да има, защото компилатора ти казва, че може да се случи нещо грешно и е добре да го обработиш. На който му пука ги обработва. Който го мързи просто слага празна клауза и кашата става по-голяма. Ама на такива прогърмисти трябва да им режат топките.
Иначе в Джава когато пишеш библиотеки е много добра идея да хвърляш изключения от време на време. Примерно класическия пример, като метода ти получава аргумент и ти трябва да провериш този аргумент. Ако параметърът не отговаря на условията (примерно е нъл) хвърлящ едно изключение, в което обясняващ, че стойности нъл не се обработват и това е. Ако параметърът е валиден обработващ го и връщаш резултата. Ако това човек иска да го направи по-друг начи ще си отели вола от писане. Другия вариант е да не се прави нищо, ама така грешките се намират много трудно.
Re: Exceptions - ЗА и ПРОТИВ
Хм, за "exception from constructors" - има няколко глави в една изключителна книга - "Exceptional C++".
Излиза че не са толкоз страшни....
Излиза че не са толкоз страшни....
Re: Exceptions - ЗА и ПРОТИВ
Това е същото като дивотиите срещу goto и срещу указателите, че имало повече бъгове, че ставал кода труден за четене ..
Не е виновен инструмента за това, че дава свобода - виновен е идиотът, който не умее да го ползва.
И когато група идиоти създадат инструменти, които отнемат свобода, за да предпазят идиота от собствената му некадърност, всички се сблъскваме с тоталния идиотизъм некъдарници да имат практическата възможност да правят отговорни неща.
Колко жалко :)
Не е виновен инструмента за това, че дава свобода - виновен е идиотът, който не умее да го ползва.
И когато група идиоти създадат инструменти, които отнемат свобода, за да предпазят идиота от собствената му некадърност, всички се сблъскваме с тоталния идиотизъм некъдарници да имат практическата възможност да правят отговорни неща.
Колко жалко :)
Re: Exceptions - ЗА и ПРОТИВ
A koi e kazal che sa strashni? :)
Strashno niama mogat da se izpolzvat, prosto triabva da se vnimava malko povehko.
Strashno niama mogat da se izpolzvat, prosto triabva da se vnimava malko povehko.
Re: Exceptions - ЗА и ПРОТИВ
Za razlika v Java-ta kadeto niamash izbor, v C++ ne si zadalzen da gi polzvash. Prakticheski ne e otneta svobodata na nikogo. Ako te kefi dobre, ako pak ne, prosto ne gi polzvash. Kade e problema?
Re: Exceptions - ЗА и ПРОТИВ
Ne razbiram ot Java no ne smyatam che "si zadaljen da gi polzvash". Kak mogat da te zadaljat? Mislya che ne si dlajen da polzwash klasovete na SUN za kakvoto i da e. Mojesh da si pishesh kakvoto si iskash. Vse edno da kajesh che C te zadaljava da polzwash stdlib.
Re: Exceptions - ЗА и ПРОТИВ
Nyama da cheta Joel.
Ako ne se laja v Effective C++ ili More Effective C++ imashe dobar anti-exception primer, ilustrirash kolko vsashtnost e sljno da se napishe siguren kod s izpolzwane na except
Ako ne se laja v Effective C++ ili More Effective C++ imashe dobar anti-exception primer, ilustrirash kolko vsashtnost e sljno da se napishe siguren kod s izpolzwane na except
Re: Exceptions - ЗА и ПРОТИВ
ами задължен си голяма част или да ги хващаш или да декларираш функциите си, че ги хвърлят.
та то това и във форума на joel го писах - в Java въобще не е толкова 'hidden' хвърлянето на exceptions. виж - в C++ си е бая скрито.
та то това и във форума на joel го писах - в Java въобще не е толкова 'hidden' хвърлянето на exceptions. виж - в C++ си е бая скрито.
Re: Exceptions - ЗА и ПРОТИВ
в ц++ нещата с изключенията са безобразно осрани. добре де, позволено е да бъдат осрани и естествено те са били. много липсва възможността да хващам всички изключения по еднотипен начин. catch( ... ) е някакво почти неизползваемо недоразумение - не дава информация какво е дошло. на уиндоуси хваща и системни изключения като access violation даже. няма finally клауза. факта, че всеки може да хвърли int или char* ме ужасява.
трябвало е просто да се направи всяко изключение, което се хвърля да бъде задължително наследник на std::exception. защо не е задължително не мога да кажа. трябвало е компилаторите да поддържат спецификациите за хвърляни изключения за функциите. за COM програмистите имам въпросче: не получавате ли духовен оргазъм като ви се наложи да пишете:
аз лично побеснявах ( ей сега ми кажете, че проверявате хрезулти като изоглавени и почвам друга свещена война. ). добре, че вече не се занимавам с КОМ. иначе ДА с 3 ръце съм за употребата на изключения. страшно много опростяват и улесняват обработването на грешки. просто в Ц++ писането на exception-safe код е трудно. можете да потърсите на МСДН има една серия статии ( 17 на брой ) дето обясняват "накратко" правилата
не искам да плюя езика. ц++ е хубав език, но иска и хубави програмисти
ein heller Schein am Firmament
трябвало е просто да се направи всяко изключение, което се хвърля да бъде задължително наследник на std::exception. защо не е задължително не мога да кажа. трябвало е компилаторите да поддържат спецификациите за хвърляни изключения за функциите. за COM програмистите имам въпросче: не получавате ли духовен оргазъм като ви се наложи да пишете:
try
{
...
}
catch( std::exception& ) //най-често наследник
{
...
}
catch( _com_error& )
{
...
}
аз лично побеснявах ( ей сега ми кажете, че проверявате хрезулти като изоглавени и почвам друга свещена война. ). добре, че вече не се занимавам с КОМ. иначе ДА с 3 ръце съм за употребата на изключения. страшно много опростяват и улесняват обработването на грешки. просто в Ц++ писането на exception-safe код е трудно. можете да потърсите на МСДН има една серия статии ( 17 на брой ) дето обясняват "накратко" правилата
не искам да плюя езика. ц++ е хубав език, но иска и хубави програмисти
ein heller Schein am Firmament
Re: Exceptions - ЗА и ПРОТИВ
Ne moze da se napravi zadalzitelen naslednik na std.STL-a ne e chast ot ezika a e prosto biblioteka kakto vsiaka druga (pochti). Edinstvennia nachin da se napravi nesto podobno e da se dobavi bazov type Exception, no tova oste po-malko bi mi haresalo. :)
C++ ne e praven nito za COM nito za Windows. Osven tova prihvastaneto na structured exceptions si e MS priumica za dobro ili losho. Na ostanalite platformi tezi exception-i si generirat core file sas ili bez prehvastane, taka che ezika ne e vinoven za podobni izpalnenia.
C++ ne e praven nito za COM nito za Windows. Osven tova prihvastaneto na structured exceptions si e MS priumica za dobro ili losho. Na ostanalite platformi tezi exception-i si generirat core file sas ili bez prehvastane, taka che ezika ne e vinoven za podobni izpalnenia.
Re: Exceptions - ЗА и ПРОТИВ
>Ne moze da se napravi zadalzitelen naslednik na std.STL-a ne e chast ot ezika a e prosto biblioteka kakto vsiaka druga (pochti).
ама може по стандарт като пропадне new да хвърля std::bad_alloc както и typeid( ... ) да връща std::type_info нали? мръсотията е свършена... стл е по-равна библиотека сред другите равни библиотеки.
>da se dobavi bazov type Exception, no tova oste po-malko bi mi haresalo. :)
вече е направено - независимо дали ти ( или ми ) харесва или не. имаш ли идея за по-добър начин?
>C++ ne e praven nito za COM nito za Windows.
просто дадох пример с уиндоуса и КОМ. ако искаш мога да ти дам пример с набъркани обработка на изключения и върнати стойности от Ц-подобни функции
ein heller Schein am Firmament
ама може по стандарт като пропадне new да хвърля std::bad_alloc както и typeid( ... ) да връща std::type_info нали? мръсотията е свършена... стл е по-равна библиотека сред другите равни библиотеки.
>da se dobavi bazov type Exception, no tova oste po-malko bi mi haresalo. :)
вече е направено - независимо дали ти ( или ми ) харесва или не. имаш ли идея за по-добър начин?
>C++ ne e praven nito za COM nito za Windows.
просто дадох пример с уиндоуса и КОМ. ако искаш мога да ти дам пример с набъркани обработка на изключения и върнати стойности от Ц-подобни функции
ein heller Schein am Firmament
Re: Exceptions - ЗА и ПРОТИВ
Oops, operator new throw-va exception ili vrasta 0.
Opitai pak. Ne barkai operator new predifiniran ot STL-a sas standartnia operator new. Tova sa dva razlichni operatora. Standartnia operator new vrasta 0. Ako iskash da ti throw-va exception thriabva da si vkluchish STL-a.
I taka poneze niama takav tip, az sam dovolen.
Chakai sega niama da obviniavame C++-a za tova che programistite sa napravili bardak. Za tova che niakoi se e uchil da polzva exception-i v biblioteka koiato polzvash ne bi triabvalo da obvianiavame exception-ite nali?
Opitai pak. Ne barkai operator new predifiniran ot STL-a sas standartnia operator new. Tova sa dva razlichni operatora. Standartnia operator new vrasta 0. Ako iskash da ti throw-va exception thriabva da si vkluchish STL-a.
I taka poneze niama takav tip, az sam dovolen.
Chakai sega niama da obviniavame C++-a za tova che programistite sa napravili bardak. Za tova che niakoi se e uchil da polzva exception-i v biblioteka koiato polzvash ne bi triabvalo da obvianiavame exception-ite nali?
Re: Exceptions - ЗА и ПРОТИВ
Да речем, че structured exceptions се хващат само в debug mode (VC++) от catch(...). В release mode трябва да положиш малко по-специални усилия това да стане. И честно казано това, че можеш да ги хванеш, не изглежда лошо за мен. По този начин ще имаш по-пълен контрол върху работата на компонента/приложението си. Понякога клиента не е очарован да загуби дани, да речем поради NULL pointer, което си е грешка на програмиста.
Да речем също така, че една от важните черти на C++ е, че не те насилва с някакъв начин на това, какво и по какъв начин от него да бъде ползвано - има я свободата на C. Ако искаш - ползвай нещо, ако не се чустваш уверен - не го ползвай.
Да речем също така, че exception handling-a би трябвало да бъде част от дизайна. При добър дизайн - едва ли трябва да имаш по един try...catch блок и повече във всеки от методите си.
Да речем също така, че една от важните черти на C++ е, че не те насилва с някакъв начин на това, какво и по какъв начин от него да бъде ползвано - има я свободата на C. Ако искаш - ползвай нещо, ако не се чустваш уверен - не го ползвай.
Да речем също така, че exception handling-a би трябвало да бъде част от дизайна. При добър дизайн - едва ли трябва да имаш по един try...catch блок и повече във всеки от методите си.
Re: Exceptions - ЗА и ПРОТИВ
Excepeptions са си баш за изключения, т.е. ако не може да се осъществи една или друга операция, а не за каквото и да е било. Според мен са незаменими, защото функцията, извършваща критичната операция трябва да с нагажда да връща код на грешката, а той е различен, при различните приложения и освен това вместо да връща код за грешка тя може да използма върнатата стойност за нещо много по-полезно, например хендъл към някакъв си обект или бог знае какво. При самия try....catch блок, върнатия exeption е обект, инстанция на клас Exeption, CExeption, TExeption....зависи от библиотеката, която се използва. И този обект съдържа много по-подробна информация за грешката, възникнала при критичната операция, като например наименование на грешката