metaclass: (Default)
[personal profile] metaclass
Это, а как в C принято обрабатывать ошибки?
Т.е. обычная программа: я открываю всякие ком-порты, сокеты и файлы, что-то с ними пытаюсь делать, затем закрываю. В дельфи/java/C#/Clojure это всегда делается через обработку исключений в виде try-finally/using или чего-то аналогичного, в C++ - RAII, а вот что делать в С? Аналогично, с выводом сообщений об ошибке - try{..}catch(Exception e) {logger.Fatal(e};raise}

Я каждую вызываемую функцию проверяю на адекватность возвращаемого результата и при ошибке вывожу в stderr сообщение и strerror(errno), причем выглядит это достаточно единообразно, чтобы хотелось автоматизировать, но принято ли делать хитрожопые макросы типа CHECKERROR(some_call(),"some_call failed") и из них вываливаться из программы при ошибках?

А, и это - принято ли в C заниматься конкатенацией строк по поводу и без повода? А то, скажем, я привык в простых программах особо не мудрить и при необходимости складывать строки, если нет явных требований к производительности. Например, какая-нибудь дурь типа генерации строковых команд из шаблонов и параметров - тупо поскладывал строки и вернул результат. А в С придется strcat использовать, буфера какие-то объявлять, память выделять, трястись за ее удаление или же писать результат прямо в выходной файл, что вообще tight coupling.

Date: 2012-04-21 07:07 pm (UTC)
From: [identity profile] w00dy.livejournal.com
Тю, делай код в стиле:
CHECK (AllocateResource1, Fin0) ;
CHECK (AllocateResource2, Fin1) ;
CHECK (AllocateResource3, Fin2) ;

use resources

FreeResource3 ;
Fin2:
FreeResource2 ;
Fin1:
FreeResource1 ;
Fin0:


и макрос
CHECK (func, label) \
if (!func ())
goto label ;
Edited Date: 2012-04-21 07:09 pm (UTC)

Date: 2012-04-21 07:43 pm (UTC)
From: [identity profile] sbj-ss.livejournal.com
Да там народ издевается, как может.
Видел и такое:
int stage = 0;
if (func1() < 0)
  goto done;
stage = 1;
if (func2() < 0)
  goto done;
stage = 2;
if (func3() < 0)
  goto done;
done:
switch(stage)
{
  case 2:
    free_res2();
  case 1:
    free_res1();
  default:
    break;
}

Кстати, что забавно - встречено в MSDN :)

Date: 2012-04-21 07:46 pm (UTC)
From: [identity profile] vp.livejournal.com
Какой феерический трындец.
(deleted comment)

Date: 2012-04-21 08:21 pm (UTC)
From: [identity profile] sbj-ss.livejournal.com
Ребе, есть одна проблема. Помните, почему во времена царя Ирода Бейсика было хорошим тоном нумеровать команды с шагом в 10? :)
Тут то же самое. Если при доработке кода между вызовами func1 и func2 потребуется делать вызов func3, то придётся либо делать stage вещественным числом (и до 1.0625 запросто дойдёт), либо запутывать себе голову.
Код такой имеет определённое право на жизнь, да, но хотя бы enum для stage объявить не мешает.
Edited Date: 2012-04-21 08:28 pm (UTC)
(deleted comment)

(no subject)

From: [identity profile] sbj-ss.livejournal.com - Date: 2012-04-21 08:39 pm (UTC) - Expand
(deleted comment)
(deleted comment)

(no subject)

From: [identity profile] sbj-ss.livejournal.com - Date: 2012-04-21 09:45 pm (UTC) - Expand

(no subject)

From: [identity profile] sbj-ss.livejournal.com - Date: 2012-04-21 09:33 pm (UTC) - Expand

Date: 2012-04-21 08:35 pm (UTC)
From: [identity profile] theiced.livejournal.com
где трындец? нормальный код. только надо забыть бред всунутый в моск долбоёбами про то что "goto плохо".

Date: 2012-04-21 08:40 pm (UTC)
From: [identity profile] sbj-ss.livejournal.com
С "goto плохо" - в жопие, где говно, с места, это понятно :)

Date: 2012-04-21 08:46 pm (UTC)
From: [identity profile] metaclass.livejournal.com
"goto v_jopy_s_govnom;"

(no subject)

From: [identity profile] theiced.livejournal.com - Date: 2012-04-21 08:48 pm (UTC) - Expand

Date: 2012-04-21 08:49 pm (UTC)
From: [identity profile] theiced.livejournal.com
не ну понятно что бензопилой можно себе хуй отпилить. бензопила то не виновата :]

Date: 2012-04-21 08:51 pm (UTC)
From: [identity profile] vp.livejournal.com
А как быть с тем, что использование goto - это последние 20 лет является безоговорочным поводом для ИТ-убийства канделябром? :)

Date: 2012-04-21 08:52 pm (UTC)
From: [identity profile] metaclass.livejournal.com
В Цэ goto для обработки ошибок разрешается :)

(no subject)

From: [identity profile] vp.livejournal.com - Date: 2012-04-21 08:57 pm (UTC) - Expand

(no subject)

From: [identity profile] theiced.livejournal.com - Date: 2012-04-21 09:00 pm (UTC) - Expand

(no subject)

From: [identity profile] vp.livejournal.com - Date: 2012-04-21 09:01 pm (UTC) - Expand

(no subject)

From: [identity profile] theiced.livejournal.com - Date: 2012-04-21 09:09 pm (UTC) - Expand

(no subject)

From: [identity profile] vp.livejournal.com - Date: 2012-04-21 09:11 pm (UTC) - Expand

(no subject)

From: [identity profile] theiced.livejournal.com - Date: 2012-04-21 09:13 pm (UTC) - Expand

(no subject)

From: [identity profile] vp.livejournal.com - Date: 2012-04-21 09:18 pm (UTC) - Expand

(no subject)

From: [identity profile] dair-spb.livejournal.com - Date: 2012-04-22 08:55 am (UTC) - Expand

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2012-04-22 09:08 am (UTC) - Expand

(no subject)

From: [identity profile] max630.livejournal.com - Date: 2012-04-22 04:14 am (UTC) - Expand

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2012-04-21 09:02 pm (UTC) - Expand

(no subject)

From: [identity profile] vp.livejournal.com - Date: 2012-04-21 09:05 pm (UTC) - Expand

(no subject)

From: [identity profile] theiced.livejournal.com - Date: 2012-04-21 09:06 pm (UTC) - Expand

(no subject)

From: [identity profile] vp.livejournal.com - Date: 2012-04-21 09:09 pm (UTC) - Expand

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2012-04-21 09:18 pm (UTC) - Expand

(no subject)

From: [identity profile] vp.livejournal.com - Date: 2012-04-21 09:19 pm (UTC) - Expand

(no subject)

From: [identity profile] thedeemon.livejournal.com - Date: 2012-04-22 05:31 am (UTC) - Expand

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2012-04-21 09:07 pm (UTC) - Expand

(no subject)

From: [identity profile] theiced.livejournal.com - Date: 2012-04-21 09:10 pm (UTC) - Expand

(no subject)

From: [identity profile] sbj-ss.livejournal.com - Date: 2012-04-21 09:17 pm (UTC) - Expand

(no subject)

From: [identity profile] theiced.livejournal.com - Date: 2012-04-21 09:35 pm (UTC) - Expand

Date: 2012-04-21 08:54 pm (UTC)
From: [identity profile] theiced.livejournal.com
ребе, только среди идиотов которые не умеют думать вообще. их потолок - говносайтики на аспнет и они нам не интересны :]

Date: 2012-04-21 08:55 pm (UTC)
From: [identity profile] theiced.livejournal.com
ну и вы же понимаете что ваши любимые эксепшны это на самом деле "готу хуй пойми куда".

(no subject)

From: [identity profile] vp.livejournal.com - Date: 2012-04-21 09:00 pm (UTC) - Expand

(no subject)

From: [identity profile] theiced.livejournal.com - Date: 2012-04-21 09:02 pm (UTC) - Expand

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2012-04-21 09:06 pm (UTC) - Expand

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2012-04-21 09:01 pm (UTC) - Expand

(no subject)

From: [identity profile] theiced.livejournal.com - Date: 2012-04-21 09:04 pm (UTC) - Expand

(no subject)

From: [identity profile] berezovsky.livejournal.com - Date: 2012-04-21 09:06 pm (UTC) - Expand

(no subject)

From: [identity profile] theiced.livejournal.com - Date: 2012-04-21 09:08 pm (UTC) - Expand

Date: 2012-04-21 08:05 pm (UTC)
From: [identity profile] sbj-ss.livejournal.com
А вообще, чтобы не забивать себе голову мильёном меток, я обычно делаю тупо и в лоб.
res1_t *res1 = NULL;
res2_t *res2 = NULL;
/* Здесь могут быть получены некоторые ресурсы, и отнюдь не обязательно все.
   Это нормально, просто тот же xmlGetNoNsProp (получить значение атрибута XML-элемента)
   вернёт NULL, если такой атрибут не указан (что в моём случае не ошибка).
 */
/* ... */
if (!cond_1)
  goto done;
if (!cond_2)
 goto done;
/* ... */
done:
if (res1) 
  free_res1(res1);
if (res2)
  free_res2(res2);
Edited Date: 2012-04-21 08:08 pm (UTC)

Date: 2012-04-21 08:11 pm (UTC)
From: [identity profile] metaclass.livejournal.com
О, вот так и надо.

Date: 2012-04-21 08:39 pm (UTC)
From: [identity profile] blackyblack.livejournal.com
Я, всё-таки, предпочитаю не использовать гото, а делать так:

while(1)
{
if (!cond)
break;

//success
break;
}

//finalizer

Date: 2012-04-21 08:45 pm (UTC)
From: [identity profile] metaclass.livejournal.com
А, лишний уровень вложенности и код, наверно гото проще для восприятия будет.

Date: 2012-04-22 06:35 am (UTC)
From: [identity profile] blackyblack.livejournal.com
Если уж нигде гото нет, то и сюда не стоит пихать. :)
А лишний уровень вложенности компенсируется тем, что циклы можно ставить повсюду безусловные. Тогда в теле цикла можно не париться с условием выхода.

Date: 2012-04-21 08:45 pm (UTC)
From: [identity profile] sbj-ss.livejournal.com
Syntactic sugar. Результирующий машинный код, сдаётся мне, будет идентичен.

Date: 2012-04-21 08:48 pm (UTC)
From: [identity profile] vp.livejournal.com
FreeAndNil, да :)

Date: 2012-04-22 11:37 am (UTC)
From: [identity profile] fkng-stupid-lj.livejournal.com
Имхо, проверки лишние в конце. Вполне можно писать код так, чтобы goto переходил точно к нужной команде освобождения. Меткам название придумывать, конечно, скучно, я их просто нумерую -- e0, e1, e2, и т. д.

Date: 2012-04-22 12:33 pm (UTC)
From: [identity profile] sbj-ss.livejournal.com
Повторюсь - возможна ситуация, когда не все ресурсы захвачены, но это не ошибка. Ну не указан какой-то опциональный атрибут у узла. В таких случаях приходится проверять.

Date: 2012-04-22 02:22 pm (UTC)
From: [identity profile] fkng-stupid-lj.livejournal.com
Такие случаи, имхо, логичнее проверять непосредственно у метки:

e2: if (bar) free_bar(bar); /* то ли выделен, то ли нет */
e1: free_baz(baz); /* заведомо выделен к этому моменту */
e0: return NULL;

Date: 2012-04-22 02:23 pm (UTC)
From: [identity profile] sbj-ss.livejournal.com
Да, хороший вариант.

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Dec. 11th, 2025 06:25 am
Powered by Dreamwidth Studios