LINUX.ORG.RU

POSIX exceptions


0

0

встретил кусочек кода (автор не известен):

try
{
struct stat fs;
stat(filename, &fs);
filesize = fs.st_size;
if(filesize <= 0x1000) return false;
fd = open(filename, O_RDONLY);
if(fd < 0) return false;
}
catch(...)
{
printf("error ");
return false;
}

я что-то наверное проспал, разве посиксовые функции умеют throwить исключения? там же pure C вроде как!

★★

Под win32 в Pure C можно кидать исключения. Только там __try ... __except / __finally.

Absurd ★★★
()
Ответ на: комментарий от golodranez

throw естественно :)

это может пригодиться, чтоб не выбиваться из с++ стиля с pure Cи функциями.

golodranez ★★★★
()
Ответ на: комментарий от golodranez

> В принципе можно писать так:

Без RAII в этом ИМХО мало смысла.

Deleted
()
Ответ на: комментарий от golodranez

ok! тогда вешаем на сабжевый код соотв. ярлык (быдлокод) и отправляем в газен.

спасибо.

k0l0b0k ★★
() автор топика
Ответ на: комментарий от Absurd

>Ну уж всяко не throw -1.

если ты пишешь на Си, то да, а если на Спп и надо в одной куче обработать функции Си и Спп, то лучше мой метод. И уж всяко не надо лепить то что ты написал чуть повыше:)

golodranez ★★★★
()
Ответ на: комментарий от Absurd

мне доставляет писать так:

int rc = RC_BAD;

if( RC_OK == func1( ) )
   rc = func2( );

return rc;

ну или

if( RC_OK == func1( ) &&
    RC_OK == func2( ) )
{
    //your code 
}

или 

bool rc = ( RC_OK == func1( ) && RC_OK == func2( ) );

if( rc )
{
    //your code
}


зачем этот неявный циклический костыль?

zh
()
Ответ на: комментарий от zh

В сложной функции твой стиль ведет к тому, что собственно рабочий код будет с сильным отступом вправо. Отвратительно.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> В сложной функции твой стиль ведет к тому, что собственно рабочий код будет с сильным отступом вправо. Отвратительно.

сложные функции стоит разбивать на функции. великолепно! =)

раньше тоже не нравилось, а сейчас - нормально. когда точка выхода из функции одна, как-то проще пишется. имхо конечно.

а вот когда по функции раскиданы return, штук 10 - вот это бесит и это отвратительно. неоправданное применение goto (которое довольно часто встречается) - почти тоже. не, хуже =)

zh
()
Ответ на: комментарий от tailgunner

кстати, в последнем варианте отступа не будет =) ну вернее он будет не больше (по факту меньше), чем в предложенном Абсурдом варианте. а читаемость всех трёх вариантов - в разы лучше. вернее не, на стремящуюся к бесконечности величину, т.к. ноль на что не умножай - всё ноль =)

zh
()
Ответ на: комментарий от zh

> сложные функции стоит разбивать на функции. великолепно! =)

После фразы "мне доставляет писать так" твое мнение стало необычайно важным для нас всех.

> раньше тоже не нравилось, а сейчас - нормально

Почитай рассказ Габышева "Люсик".

> а вот когда по функции раскиданы return, штук 10 - вот это бесит и это отвратительно.

Тебе никто такого и не предлагал.

tailgunner ★★★★★
()
Ответ на: комментарий от zh

> ты чего злой такой?

Это я еще добрый, только в легком раздражении. Не люблю, знаешь ли, когда изобретаются даже не велосипеды - колеса. Причем затейливой формы.

tailgunner ★★★★★
()
Ответ на: комментарий от zh

> а где я что-то изобрёл? О_О

Те, кому доставляе езда на квадратных колесах - они тоже раздражают.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

возраст != адекватность все-таки. да и я далеко не юноша к сожалению )). Сабжевый подход (с минимумом return'ов) намного лучше себя показывает при отладке, потому и юзаю.

k0l0b0k ★★
() автор топика
Ответ на: комментарий от tailgunner

>А что, тебе предлагали использовать кучу return'ов?

собсно нет. просто в стороннем коде чехарду с return можно увидеть достаточно часто.

k0l0b0k ★★
() автор топика

Бред какой-то :-)

smh ★★★
()
Ответ на: комментарий от golodranez

>>а вот когда по функции раскиданы return, штук 10 - вот это бесит и это отвратительно

> иногда без этого не обойтись

Да ну, нет прощения. На крайняк, всегда можно втупую делать goto ret;

tailgunner ★★★★★
()
Ответ на: комментарий от golodranez

> иногда без этого не обойтись

когда например?

lester ★★★★
()
Ответ на: комментарий от tailgunner

> Да ну, нет прощения. На крайняк, всегда можно втупую делать goto ret;

Это если памяти дофига. А если её не дофига, то goto ret - это, в лучшем случае, 2 байта. А от кода вида:

ret = -EINVAL;
if (...)
    goto out;

ret = -EPERM;
if (...)
    goto out;

ret = -EACCES;
if (...)
    goto out;

ret = -ENOMEM;
if (...)
    goto out;

меня прямо трясёт, если там можно сделать return -EXYZ;

mv ★★★★★
()
Ответ на: комментарий от mv

>> Да ну, нет прощения. На крайняк, всегда можно втупую делать goto ret;

> Это если памяти дофига. А если её не дофига, то goto ret - это, в лучшем случае, 2 байта.

Ахренеть. И давно ты экономишь байты _кода_?

> меня прямо трясёт, если там можно сделать return -EXYZ;

Так, кто ты такой и что сделал с настоящим mv?

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> Ахренеть. И давно ты экономишь байты _кода_?

Хочешь сказать, что лиспер не имеет морального права на экономию ресурсов?

> Так, кто ты такой и что сделал с настоящим mv?


$ rpm -qf `which mv`
coreutils-7.2-1.fc11.x86_64

Всё настоящее.

mv ★★★★★
()
Ответ на: комментарий от mv

>> Ахренеть. И давно ты экономишь байты _кода_?

> Хочешь сказать, что лиспер не имеет морального права на экономию ресурсов?

Нет. Я хочу сказать, что экономить 2 байта кода (да хоть и 4) - это смешно. Так сразу и не вспомню, чтобы мне приходилось экономить байты кода при работе на Си. Даже в ассемблере такое редко.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Копейка рубль бережёт. По-твоему, например, все патчи, уменьшающие кол-во говна в ядре и уменьшающие размер .text - это фигня полная?

mv ★★★★★
()
Ответ на: комментарий от golodranez

> за goto убивать надо.

Начни с Кнута, продолжи Линусом, ну и далее - через одного всех разрабов ядра %)

tailgunner ★★★★★
()
Ответ на: комментарий от mv

> меня прямо трясёт, если там можно сделать return -EXYZ;

а зря. компилятору все равно. даже наоборот, скорее всего
компайлер return's превратит в goto's to eдинственную точку
выхода.

ну, и понятно, что в данном случае код с goto намного легче
модифицировать. напр, представь, что однажды выяснится, что
все проверки нужно делать под spin_lock().

idle ★★★★★
()
Ответ на: комментарий от idle

> а зря. компилятору все равно. даже наоборот, скорее всего
компайлер return's превратит в goto's to eдинственную точку
выхода.

Нет. Goto в вышеозначенном контексте никакой машинной пользы не даёт, одни пустые растраты.

> днажды выяснится, что все проверки нужно делать под spin_lock().


А потом, когда переделают на goto, выяснится, что иногда проверки нужно делать без спилоков. Сделают обёртку вроде spin_lock(); abc(); spin_unlock();, но говно в виде кучи ненужных goto останется. Знаем, плавали :)

mv ★★★★★
()
Ответ на: комментарий от tailgunner

> Точно. Десять старушек - это уже рубль!!!11

Джамп на последующий рет - это такое же зло, как и ide на йаве. Не меньше.

mv ★★★★★
()
Ответ на: комментарий от mv

>> днажды выяснится, что все проверки нужно делать под spin_lock().

> А потом, когда переделают на goto

Надо сразу юзать благословленный стиль.

> говно в виде кучи ненужных goto

Не нужные goto не большее говно, чем ненужные return

> Джамп на последующий рет - это такое же зло, как и ide на йаве. Не меньше.

Если это и в самом деле джамп на рет, компилятор сам разберется. Так что структурные goto рулят даже сильнее, чем IDE на яве %)

tailgunner ★★★★★
()
Ответ на: комментарий от mv

> > а зря. компилятору все равно. даже наоборот, скорее всего
> > компайлер return's превратит в goto's to eдинственную точку
> > выхода.
>
> Нет. Goto в вышеозначенном контексте никакой машинной пользы
> не даёт, одни пустые растраты.

да нету же растрат никаких.

int a(void), b(void), c(void);

int f(void)
{
        int ret;

        ret = -1;
        if (a()) goto out;

        ret = -2;
        if (b()) goto out;

        ret = -3;
        if (c()) goto out;

        ret = 0;
out:
        return ret;
}

int g(void)
{
        if (a()) return -1;
        if (b()) return -2;
        if (c()) return -3;
        return 0;
}

посмотри на ассемблер.

idle ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.