Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> оповещение об ошибках в C, кто как делает? 
:(
    Опции темы
kosmonaFFFt
Дата 19.6.2012, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 538
Регистрация: 14.4.2008
Где: Иннополис

Репутация: нет
Всего: 5



Доброго времени суток...

Пишу небольшую библиотеку на C, и никак не могу придумать хороший и удобный, кроссплатформенный и единообразный способ оповещения об ошибках (привычных мне исключений нету ведь)... Собственно прошу поделиться опытом, кто-как делает, стоит ли использовать что-то наподобие libexcept и т. д.

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

В общем пытаюсь найти золотую середину, но пока не могу...

Заранее спасибо...

Это сообщение отредактировал(а) kosmonaFFFt - 19.6.2012, 18:48


--------------------
user posted image
PM MAIL ICQ   Вверх
500mhz
Дата 19.6.2012, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: нет
Всего: 14



Ну во есть такая фигня как регистр флагов, через него можно возвращать ненавязчиво состояние функ



--------------------

PM MAIL ICQ   Вверх
borisbn
Дата 19.6.2012, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



а мне понравилось как в WinAPI (тфу-тьфу-тьфу, сгинь) - делать ф-цию типа GetLastError:
Код

char global_error_string[ много ];
bool /* или bool тоже нет в Си??? */ foo() {
    if ( всё OK ) {
        ...
        return true;
    }
    else {
        strncpy( global_error_string, sizeof( global_error_string ), "Всё плохо" );
        return false;
    }
    return ХЗ;
}

const /* а это то хоть есть ? */ char * what_the_fk() {
    return global_error_string;
}

...
if ( ! foo() ) {
    printf( "%s\n", what_the_fk() );
}


Это сообщение отредактировал(а) borisbn - 19.6.2012, 20:49


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
volatile
Дата 19.6.2012, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(kosmonaFFFt @  19.6.2012,  18:44 Найти цитируемый пост)
привычных мне исключений нету ведь

Можно организовать нечто очень похожее на исключения.
смотрите стандартные функции: setjmp (), longjmp (), и т.д.


PM MAIL   Вверх
kosmonaFFFt
Дата 20.6.2012, 05:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 538
Регистрация: 14.4.2008
Где: Иннополис

Репутация: нет
Всего: 5



Цитата(borisbn @  20.6.2012,  00:49 Найти цитируемый пост)
а мне понравилось как в WinAPI (тфу-тьфу-тьфу, сгинь) - делать ф-цию типа GetLastError:

А как у этого метода с потокобезопасностью? Если например две функции, вызванные параллельно выдадут ошибку одновременно?


Цитата(volatile @  20.6.2012,  03:38 Найти цитируемый пост)
Можно организовать нечто очень похожее на исключения.
смотрите стандартные функции: setjmp (), longjmp (), и т.д.

Ага, даже нашел несколько библиотек, реализующих "исключения", например http://sourceforge.net/projects/libexcept/, но есть сомнения, не вызовет ли это еще больше багов, как будут обрабатываться непойманные "исключения" и т. д. Если знаете какие-нибудь надежные существующие решения под некопилефт лицензиями (Apache, MIT, BSD, WTFPL, и т. д.), был бы рад про них узнать...

UPD.
Так же интересуют способы получения стектрейсов в случае ошибки...

Это сообщение отредактировал(а) kosmonaFFFt - 20.6.2012, 07:49


--------------------
user posted image
PM MAIL ICQ   Вверх
borisbn
Дата 20.6.2012, 08:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(kosmonaFFFt @  20.6.2012,  05:48 Найти цитируемый пост)
А как у этого метода с потокобезопасностью? 

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

Цитата(kosmonaFFFt @  20.6.2012,  05:48 Найти цитируемый пост)
Так же интересуют способы получения стектрейсов в случае ошибки...

http://www.codeproject.com/Articles/11132/...g-the-callstack
замечательная штука, но Windows/Linux only. Там, правда, на Си++, но это только обёртка. Её можно "снять" и получишь на Си


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
kosmonaFFFt
Дата 20.6.2012, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 538
Регистрация: 14.4.2008
Где: Иннополис

Репутация: нет
Всего: 5



Нет, это не для контроллера... Изначально забыл написать про многопоточность, но очень вероятно выполнение всей этой байды, которую я потихоньку пишу, в многопоточной среде, соответственно всякие глобальные переменные и прочее отпадает, а как красиво сделать без них я пока не придумал...

Добавлено через 2 минуты и 21 секунду
Цитата(borisbn @  20.6.2012,  12:24 Найти цитируемый пост)
замечательная штука, но Windows/Linux only.

Похоже вообще только Windows-only


--------------------
user posted image
PM MAIL ICQ   Вверх
math64
Дата 20.6.2012, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Если только для Windows - OuputDebugString() + утилита DebugView для просмотра (скачивается с сайта microsoft.com)
PM   Вверх
kosmonaFFFt
Дата 20.6.2012, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 538
Регистрация: 14.4.2008
Где: Иннополис

Репутация: нет
Всего: 5



Цитата(math64 @  20.6.2012,  13:04 Найти цитируемый пост)
Если только для Windows - OuputDebugString() + утилита DebugView для просмотра (скачивается с сайта microsoft.com) 


Спасибо, но интересуют только кроссплатформенные решения...


--------------------
user posted image
PM MAIL ICQ   Вверх
borisbn
Дата 20.6.2012, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(kosmonaFFFt @  20.6.2012,  08:30 Найти цитируемый пост)
Похоже вообще только Windows-only 

упс... пардон. у меня, просто,  водном каталоге лежал StackWalker и ещё одна приблуда (call_stack_gcc.cpp и call_stack_msvc.cpp)
Прикрепляю архив

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  stacker.zip 3,45 Kb


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
kosmonaFFFt
Дата 20.6.2012, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 538
Регистрация: 14.4.2008
Где: Иннополис

Репутация: нет
Всего: 5



Хм, спасибо, штука интересная, может попробую использовать...


--------------------
user posted image
PM MAIL ICQ   Вверх
xvr
Дата 20.6.2012, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(kosmonaFFFt @  19.6.2012,  18:44 Найти цитируемый пост)
Пишу небольшую библиотеку на C, и никак не могу придумать хороший и удобный, кроссплатформенный и единообразный способ оповещения об ошибках

В библиотеке делаете указатель на функцию, которая быдет вызываться библиотекой в случае ошибки. По умолчанию там стоит заглушка (пустая функция). Указатель может инициализировать пользователь библиотеки своей функцией (а уж в ней делать что хочет - ругаться в консоль, убивать программу или делать аналог exception'ов через setjmp/longjmp)

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

PM MAIL   Вверх
kosmonaFFFt
Дата 20.6.2012, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 538
Регистрация: 14.4.2008
Где: Иннополис

Репутация: нет
Всего: 5



Тоже над этим вариантом думал, но непонятно как быть с многопоточностью... Указатель то на коллбэк всего один...


--------------------
user posted image
PM MAIL ICQ   Вверх
xvr
Дата 20.6.2012, 15:15 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(kosmonaFFFt @  20.6.2012,  15:06 Найти цитируемый пост)
но непонятно как быть с многопоточностью... Указатель то на коллбэк всего один...

Для этого есть thread-local переменные. Они есть на всех платформах, но синтаксис их увы отличается.

PM MAIL   Вверх
kosmonaFFFt
Дата 20.6.2012, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 538
Регистрация: 14.4.2008
Где: Иннополис

Репутация: нет
Всего: 5



Ок, погуглю на эту тему...


--------------------
user posted image
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0752 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.