metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2012-04-21 09:12 pm

Чистый C, обработка ошибок

Это, а как в 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.

[identity profile] sbj-ss.livejournal.com 2012-04-21 07:43 pm (UTC)(link)
Да там народ издевается, как может.
Видел и такое:
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 :)

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

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

[identity profile] sbj-ss.livejournal.com 2012-04-21 08:39 pm (UTC)(link)
А stage при этом присваивается 47? :)
Иногда ж ресурсы приходится освобождать в порядке, обратном выделению.
(deleted comment)
(deleted comment)

(no subject)

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

[identity profile] sbj-ss.livejournal.com 2012-04-21 09:33 pm (UTC)(link)
В реальной жизни захват и освобождение ресурсов не нумерованы. Т.е. будет acquireSomeRes(), allocSomeRes(), getSomeRes(), InitSomeRes() и парные им freeSomeRes(), releaseSomeRes(), deAllocSomeRes(), weDontNeedThisResAnyMore() - и, по закону подлости, именно в парном соответствии. А константа состояния захвата 47 не говорит ничего.
Почему я и настаиваю на использовании для stage перечисления вида
typedef enum _someOpStage {
SOME_OP_STAGE_Res1,
SOME_OP_STAGE_Res2,
/* ... */
} someOpStage
Edited 2012-04-21 21:37 (UTC)

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

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

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

[identity profile] theiced.livejournal.com 2012-04-21 08:48 pm (UTC)(link)
krome corpse

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

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

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

[identity profile] vp.livejournal.com 2012-04-21 08:57 pm (UTC)(link)
Да, и иногда можно в одном коде писать CR во второй половине файла, когда в первой идет все с CRLF. Мы уже в курсе :)
Один раз не пидорас.

[identity profile] theiced.livejournal.com 2012-04-21 09:00 pm (UTC)(link)
это ребе просто обманули бабуинасты. что бы отослать патч в кернел - надо всего лишь открыть баг в багзилле и зааттачить туда патчик. с любыми \r\n

(no subject)

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

(no subject)

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

(no subject)

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

(no subject)

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

(no subject)

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

(no subject)

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

(no subject)

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

(no subject)

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

[identity profile] metaclass.livejournal.com 2012-04-21 09:02 pm (UTC)(link)
Ой, я тут напрограммился на С уже. 100 строк прототип проги, а задолбался, как не в себя. Хелпов контекстных нет, копи-пейст см. ниже по ЖЖ, интеллисенса нет, переменные только в начале функции, мейкфайлы анальны, итд

(no subject)

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

(no subject)

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

(no subject)

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

(no subject)

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

(no subject)

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

(no subject)

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

(no subject)

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

(no subject)

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

(no subject)

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

(no subject)

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

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

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

[identity profile] vp.livejournal.com 2012-04-21 09:00 pm (UTC)(link)
Не, оно непонятно куда только у совершенно аццких пионеров, которых надо сцаными тряпками гнать из профессии

[identity profile] theiced.livejournal.com 2012-04-21 09:02 pm (UTC)(link)
псевдокод:

foo() {
  throw "и чо";
}

bar() {
  try {
    foo();
  } catch() {
  }

  foo();
}


хуй пойми куда в месте выброса. с готу можно найти сию метку хотя бы.

(no subject)

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

[identity profile] metaclass.livejournal.com 2012-04-21 09:01 pm (UTC)(link)
Не совсем. Там внутри очень дохуя манипуляции стеками.

[identity profile] theiced.livejournal.com 2012-04-21 09:04 pm (UTC)(link)
но по итогу это готу в 1313.

(no subject)

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

(no subject)

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