error /exception handling
11 отговора
437 прегледа
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.
една след друга се викат функции които врущат код на грешка.
за простота приемаме, че ако има грешка независимо на коя стъпка правиме едно и сещо нещо.
кое според вас е по-добре?
а)
------------------------------------------------------
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н на
Re: error /exception handling
П.П. функциите са примерно от някакво API, т.е. не могат да бъдат пренаписани сами да си генерират exception.
могат да бъдат wrap-nati сигурно поне?
могат да бъдат wrap-nati сигурно поне?
Re: error /exception handling
значи твоето предложение е да се wrap-nat функциите?
това е възможно, но не мислиш ли, че е по-добре в кода да виждаш API функциите, отколкото някакви измислени функции, които да трябва да ги проследяваш, за да видиш какво правят?
това е възможно, но не мислиш ли, че е по-добре в кода да виждаш API функциите, отколкото някакви измислени функции, които да трябва да ги проследяваш, за да видиш какво правят?
Re: error /exception handling
еми зависи и от колко места ще ги викаш тия функции - ако са много ще трябва на много места да пишеш ифовете....
а за имената на функциите - еми може ако оригиналната функция е Boza, wrapnatata da e wBoza ili v nekyv namespace exapi::Boza :-)
a и самото wrapwane би могло да стане лесно с няколко макроса...
а за имената на функциите - еми може ако оригиналната функция е Boza, wrapnatata da e wBoza ili v nekyv namespace exapi::Boza :-)
a и самото wrapwane би могло да стане лесно с няколко макроса...
Re: error /exception handling
Az predpochitam A, no tova e glavno poradi fakta che nikoga ne mi se e nalagalo da polzwam exceptions.
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
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
Re: error /exception handling
По принцип goto rulz
, поне за мен.
Забравяш, обаче и третата постановка, която е с множество вложени if-чета. Нея никой не я харесва, щото кода става боза.

Я вышел им наперерез!
Забравяш, обаче и третата постановка, която е с множество вложени if-чета. Нея никой не я харесва, щото кода става боза.
Я вышел им наперерез!
Re: error /exception handling
варианта с многото вложени if-ове е пълна боза, каквото щат да казват привържениците на структурното програмиране.
Re: error /exception handling
Абе това с невидимото wrap-ване не ми харесва като идея - някой ще го гледа после кода и ще се чуди какво става. Аз бих ги wrap-нал, ама с добавяне на нещо към името, примерно слагаш ги всичките в един namespace и ги викаш.
Каквито и недостатъци да имат exception-ите (според един познат на български се превежда като "изцепка"), кода става много по-прозрачен и ясен с тях.
Каквито и недостатъци да имат exception-ите (според един познат на български се превежда като "изцепка"), кода става много по-прозрачен и ясен с тях.
Re: error /exception handling
А така, exception-ите са си културна работа. С тия goto... още малко етикети на редовете ще искате да си слагате.
Аз поне съм възпитан във стриктно отбягване на jump-овете. А многото вложени if-чета, хм, то не е нужно особено възпитание за да не ти харесват.
Абе това с невидимото wrap-ване не ми харесва като идея - някой ще го гледа после кода и ще се чуди какво става.
Подхода си е хитър, ама наистина малко подвеждащо. Напомня на:
for (i=5; i--; )
Аз поне съм възпитан във стриктно отбягване на jump-овете. А многото вложени if-чета, хм, то не е нужно особено възпитание за да не ти харесват.
Абе това с невидимото wrap-ване не ми харесва като идея - някой ще го гледа после кода и ще се чуди какво става.
Подхода си е хитър, ама наистина малко подвеждащо. Напомня на:
for (i=5; i--; )
Re: error /exception handling
От гледна точка на четимостта няма разлика между двата варианта. За try-catch, обаче, трябва да се дефинира отделен тип за ексепшъна (много типове - бозав проект), освен това метода е по-бавен.
Я вышел им наперерез!
Я вышел им наперерез!
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.