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-22 12:52 am (UTC)
From: [identity profile] baramin.livejournal.com
В нашем проекте я законодательно запретил С. Ибо, если если есть С, есть и С++. Иначе - нефиг.
Ну, если лезть обратно на пальму, то
1]
status = 0;
while (1) {
if ( fail(status = f1()) )
break;
if ( fail(status = f2()) )
break;
status = f3();
break;
}
//зачищаем всех, кто не NULL

2] лестница (MS COM approach)
var lhv1;
status = create1(&lhv1);
if (fail(status)) {
print_error(status);
} else {
//хитрость в том, что dispose пишется сразу.
//статус заверщения - глобален! Привет HRESULT
//здесь в том же формате пишем второй шаг (рекурсия:) ):
var lhv2;
status = create2(&lhv2);
if (fail(status)) {
print_error(status);
} else {
//next step is here
dispose(lhv2)
}

dispose(lhv1)
}
return status.

Date: 2012-04-22 07:07 am (UTC)
From: [identity profile] metaclass.livejournal.com
Торвальдс воспрещает С++ :)
Впрочем, у меня как раз наверно и на С++ можно было бы все сделать и было бы проще.

Date: 2012-04-22 08:47 am (UTC)
From: [identity profile] justy-tylor.livejournal.com
Для серверов/десктопов ок. Но на других платформах бывают проблемы с поддержкой исключений, что вынуждает использовать хитрые макросы и в сишном, и в плюсовом коде. Телефоны, телевизоры, Xbox 360...

Date: 2012-04-22 09:14 am (UTC)
From: [identity profile] esil0x.livejournal.com
Так RAII прекрасно работает и без исключений. Все выделенные ресурсы будут подчищаться перед return, независимо от того, где return сделать.

Date: 2012-04-22 09:40 am (UTC)
From: [identity profile] justy-tylor.livejournal.com
RAII работает для ресурсов, но не для control flow. Для кода f(); g(); возникновение исключения внутри f() должно отменить выполнение g(), и далее по стеку. Вызовы всёх функций-с-исключениями придётся обернуть в макросы.

Date: 2012-04-22 09:42 am (UTC)
From: [identity profile] esil0x.livejournal.com
Ну в отсутствии исключений обычно используют коды возврата. Проверил код возврата f() и вернул управление, если код плохой.

Date: 2012-04-22 09:55 am (UTC)
From: [identity profile] justy-tylor.livejournal.com
Вот чтобы не захламлять исходники сотнями if (problem) return dummy; приличные люди и используют макросы.

Date: 2012-04-22 09:59 am (UTC)
From: [identity profile] esil0x.livejournal.com
Так это дело вкуса и ортогонально проблеме очистки ресурсов.

Date: 2012-04-22 10:13 am (UTC)
From: [identity profile] blackyblack.livejournal.com
C++ так-то ничем не лучше Си. Исключения - тот же гото, только в профиль. :) А первый пункт правильно написан - я как раз его выше предложил.

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 Sep. 17th, 2025 01:13 pm
Powered by Dreamwidth Studios