![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| kosmonaFFFt |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 538 Регистрация: 14.4.2008 Где: Иннополис Репутация: нет Всего: 5 |
Доброго времени суток...
Пишу небольшую библиотеку на C, и никак не могу придумать хороший и удобный, кроссплатформенный и единообразный способ оповещения об ошибках (привычных мне исключений нету ведь)... Собственно прошу поделиться опытом, кто-как делает, стоит ли использовать что-то наподобие libexcept и т. д. Собственно тут что получается - если всегда возвращать код ошибки/успеха, то неудобно пользоваться функциями, что-то возвращающими, если делать доп. параметр, то не всегда удобно их игнорировать... В общем пытаюсь найти золотую середину, но пока не могу... Заранее спасибо... Это сообщение отредактировал(а) kosmonaFFFt - 19.6.2012, 18:48 -------------------- ![]() |
|||
|
||||
| 500mhz |
|
|||
![]() шайтан ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1017 Регистрация: 5.5.2008 Где: Киев / Italy Репутация: нет Всего: 14 |
Ну во есть такая фигня как регистр флагов, через него можно возвращать ненавязчиво состояние функ
-------------------- |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
а мне понравилось как в WinAPI (тфу-тьфу-тьфу, сгинь) - делать ф-цию типа GetLastError:
Это сообщение отредактировал(а) borisbn - 19.6.2012, 20:49 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
||||
|
||||
| kosmonaFFFt |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 538 Регистрация: 14.4.2008 Где: Иннополис Репутация: нет Всего: 5 |
А как у этого метода с потокобезопасностью? Если например две функции, вызванные параллельно выдадут ошибку одновременно?
Ага, даже нашел несколько библиотек, реализующих "исключения", например http://sourceforge.net/projects/libexcept/, но есть сомнения, не вызовет ли это еще больше багов, как будут обрабатываться непойманные "исключения" и т. д. Если знаете какие-нибудь надежные существующие решения под некопилефт лицензиями (Apache, MIT, BSD, WTFPL, и т. д.), был бы рад про них узнать... UPD. Так же интересуют способы получения стектрейсов в случае ошибки... Это сообщение отредактировал(а) kosmonaFFFt - 20.6.2012, 07:49 -------------------- ![]() |
||||
|
|||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Никак. Этого не было в задании ))) Я, вообще-то, думал, что ты переходишь на Си, потому, что нужно писать на какой-нить контроллер, а там, обычно, у процессора одно ядро и несколько потоков только замедлят работу.
http://www.codeproject.com/Articles/11132/...g-the-callstack замечательная штука, но Windows/Linux only. Там, правда, на Си++, но это только обёртка. Её можно "снять" и получишь на Си -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| kosmonaFFFt |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 538 Регистрация: 14.4.2008 Где: Иннополис Репутация: нет Всего: 5 |
Нет, это не для контроллера... Изначально забыл написать про многопоточность, но очень вероятно выполнение всей этой байды, которую я потихоньку пишу, в многопоточной среде, соответственно всякие глобальные переменные и прочее отпадает, а как красиво сделать без них я пока не придумал...
Добавлено через 2 минуты и 21 секунду Похоже вообще только Windows-only -------------------- ![]() |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Если только для Windows - OuputDebugString() + утилита DebugView для просмотра (скачивается с сайта microsoft.com)
|
|||
|
||||
| kosmonaFFFt |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 538 Регистрация: 14.4.2008 Где: Иннополис Репутация: нет Всего: 5 |
Спасибо, но интересуют только кроссплатформенные решения... -------------------- ![]() |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
упс... пардон. у меня, просто, водном каталоге лежал StackWalker и ещё одна приблуда (call_stack_gcc.cpp и call_stack_msvc.cpp) Прикрепляю архив Присоединённый файл ( Кол-во скачиваний: 5 )
stacker.zip 3,45 Kb-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| kosmonaFFFt |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 538 Регистрация: 14.4.2008 Где: Иннополис Репутация: нет Всего: 5 |
Хм, спасибо, штука интересная, может попробую использовать...
-------------------- ![]() |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
В библиотеке делаете указатель на функцию, которая быдет вызываться библиотекой в случае ошибки. По умолчанию там стоит заглушка (пустая функция). Указатель может инициализировать пользователь библиотеки своей функцией (а уж в ней делать что хочет - ругаться в консоль, убивать программу или делать аналог exception'ов через setjmp/longjmp) После возврата из этой функции библиотека осуществляет действие по умолчанию - для нефатальных ошибок молча их игнорирует, для фатальных - аварийно завершает работу |
|||
|
||||
| kosmonaFFFt |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 538 Регистрация: 14.4.2008 Где: Иннополис Репутация: нет Всего: 5 |
Тоже над этим вариантом думал, но непонятно как быть с многопоточностью... Указатель то на коллбэк всего один...
-------------------- ![]() |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
||||
|
||||
| kosmonaFFFt |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 538 Регистрация: 14.4.2008 Где: Иннополис Репутация: нет Всего: 5 |
Ок, погуглю на эту тему...
-------------------- ![]() |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |