error /exception handling

11 отговора 437 прегледа
#1

error /exception handling

имаме следната постановка:
една след друга се викат функции които врущат код на грешка.
за простота приемаме, че ако има грешка независимо на коя стъпка правиме едно и сещо нещо.
кое според вас е по-добре?


а)
------------------------------------------------------
if (func1() == err) goto odi_se_peri;
if (func2() == err) goto odi_se_peri;
........
if (funcN() == err) goto odi_se_peri;

odi_se_peri:
perem_se();

или
б)
--------------------------------------------------------

try
{
if (func1() == err) throw triabva_da_se_izpere;
if (func2() == err) throw triabva_da_se_izpere;
.......
if (funcN() == err) throw triabva_da_se_izpere;
}
catch(throw triabva_da_se_izpere)
{
pere_se();
}

--------------------------------------------------------

въпроса с производителността е ясен, така, че него няма защо да го дискутираме.

П.П. функциите са примерно от някакво API, т.е. не могат да бъдат пренаписани сами да си генерират exception.

Редактирано от Плaмeн на

Отговор
в отговор на Плaмeн #2

Re: error /exception handling

П.П. функциите са примерно от някакво API, т.е. не могат да бъдат пренаписани сами да си генерират exception.

могат да бъдат wrap-nati сигурно поне?

Отговор
в отговор на Questor #3

Re: error /exception handling

значи твоето предложение е да се wrap-nat функциите?
това е възможно, но не мислиш ли, че е по-добре в кода да виждаш API функциите, отколкото някакви измислени функции, които да трябва да ги проследяваш, за да видиш какво правят?

Отговор
в отговор на Плaмeн #4

Re: error /exception handling

еми зависи и от колко места ще ги викаш тия функции - ако са много ще трябва на много места да пишеш ифовете....

а за имената на функциите - еми може ако оригиналната функция е Boza, wrapnatata da e wBoza ili v nekyv namespace exapi::Boza :-)

a и самото wrapwane би могло да стане лесно с няколко макроса...

Отговор
в отговор на Плaмeн #5

Re: error /exception handling

Az predpochitam A, no tova e glavno poradi fakta che nikoga ne mi se e nalagalo da polzwam exceptions.

Отговор
в отговор на Questor #6

Re: error /exception handling

Ako bibliotekata e pisana na C, to mozhe funkciite lesno da se wrapnat kato funkcii sus sushtite imena budat napisani na C++ (linkera njama da ima problem s tova).

library.c
int Function1( int arg1, int arg2 )
{
if( arg1 > arg2 ) // error
return 222; // some error code
....
return 0; // ok
}

library-wrapped.cpp
void Function1( int arg1, int arg2 )
{
extern "C" int Function1(int arg1, int arg2);
r = Function1( arg1, arg2 )
switch( r )
{
case 222: throw some_error_code_222;
case ...: ....
case 0: return;
}
}

library-wrapped.cpp mozhe da bude generirana avtomaticheski

Отговор
в отговор на Плaмeн #7

Re: error /exception handling

По принцип goto rulz , поне за мен.
Забравяш, обаче и третата постановка, която е с множество вложени if-чета. Нея никой не я харесва, щото кода става боза.



Я вышел им наперерез!
Отговор
в отговор на Resurrector #8

Re: error /exception handling

варианта с многото вложени if-ове е пълна боза, каквото щат да казват привържениците на структурното програмиране.

Отговор
в отговор на malkia #9

Re: error /exception handling

Абе това с невидимото wrap-ване не ми харесва като идея - някой ще го гледа после кода и ще се чуди какво става. Аз бих ги wrap-нал, ама с добавяне на нещо към името, примерно слагаш ги всичките в един namespace и ги викаш.

Каквито и недостатъци да имат exception-ите (според един познат на български се превежда като "изцепка"), кода става много по-прозрачен и ясен с тях.

Отговор
в отговор на Skotowydec #10

Re: error /exception handling

А така, exception-ите са си културна работа. С тия goto... още малко етикети на редовете ще искате да си слагате.

Аз поне съм възпитан във стриктно отбягване на jump-овете. А многото вложени if-чета, хм, то не е нужно особено възпитание за да не ти харесват.

Абе това с невидимото wrap-ване не ми харесва като идея - някой ще го гледа после кода и ще се чуди какво става.
Подхода си е хитър, ама наистина малко подвеждащо. Напомня на:
for (i=5; i--; )



Отговор
в отговор на Vroomfundel #11

Re: error /exception handling

От гледна точка на четимостта няма разлика между двата варианта. За try-catch, обаче, трябва да се дефинира отделен тип за ексепшъна (много типове - бозав проект), освен това метода е по-бавен.


Я вышел им наперерез!
Отговор
в отговор на Плaмeн #12

Re: error /exception handling

Ako iskash da obrabotvash greshkata v sustia context kudeto se vikat API funkciite purvia variant e po dobre, zastoto e po burz. No ako po natatuk ti se priiska da ia obrabotvash na drugo miasto varianta s goto/return err ste ti doide nanagorno, togava s exceptions ste stane po elegantno, a i osven tova poluchavash kato bonus avtomatichno osvobojdavane na obektite v steka.

Отговор