powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / как обрабатывать исключительные ситуации в чистом СИ
19 сообщений из 19, страница 1 из 1
как обрабатывать исключительные ситуации в чистом СИ
    #36000668
сишникЛя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
назрел вопрос: кто и каким образом обрабатывает исключительные ситуации в чистом СИ?
Например:
int x;
scanf("%d", &x); // буду вводить специально строку, тогда все зацикливается, как в матрице

какие существуют решения? неплохо бы линк дать, если что то уже есть
...
Рейтинг: 0 / 0
как обрабатывать исключительные ситуации в чистом СИ
    #36000675
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
упс! в чистом С не бывает исключений, механизма такого не предусмотрено в языке.
...
Рейтинг: 0 / 0
как обрабатывать исключительные ситуации в чистом СИ
    #36000688
сишникЛя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
egorych это знаю, а как ты борешься с этим? вставляешь кучу флагов?
например как застраховаться даже от некорректного ввода с клавиатуры?
вообще как ошибки отлавливать?
ведь написано миллиарды строк кода на СИ и программы очень усточевые?
как их пишут?
...
Рейтинг: 0 / 0
как обрабатывать исключительные ситуации в чистом СИ
    #36000719
avb1003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сишникЛяegorych это знаю, а как ты борешься с этим? вставляешь кучу флагов?
например как застраховаться даже от некорректного ввода с клавиатуры?
вообще как ошибки отлавливать?
ведь написано миллиарды строк кода на СИ и программы очень усточевые?
как их пишут?Вот так и пишут, чтоб были устойчивые.сишникЛяscanf("%d", &x); // буду вводить специально строку, тогда все зацикливается, как в матрицеscanf - отстой. Всегда делал вроде:
Код: plaintext
1.
2.
fgets(buf, 80 ,stdin);
sscanf(buf,"%d",&x);
При необходимости анализировал возвращаемое sscanf значение и число просканированных символов.
...
Рейтинг: 0 / 0
как обрабатывать исключительные ситуации в чистом СИ
    #36001064
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сишникЛя wrote:

> вообще как ошибки отлавливать?

Проверять всё.

> ведь написано миллиарды строк кода на СИ и программы очень усточевые?
> как их пишут?

Да так и пишут: берут и пишут. И думают при этом.

Ну и на счёт того, что "СИ программы очень усточевые" --
есть разные, есть и устойчивые, и неустойчивые. Как напишешь
в общем.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
как обрабатывать исключительные ситуации в чистом СИ
    #36001336
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
как обрабатывать исключительные ситуации в чистом СИ
    #36001893
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сишникЛявообще как ошибки отлавливать?
ведь написано миллиарды строк кода на СИ и программы очень усточевые?
как их пишут?
Язык С считается портабельным ассеблером. А в ассемблере ошибка существует очень кратковременно. Например результат переполнения арифм. операции включает флажок. Но это длиться мгновения. Следующая инструкция может этот флажок сбросить. Это самый ДЕШЕВЫЙ и БЫСТРЫЙ способ фиксации исключительной ситуации. В низкоуровневом API ядра ОС, практически все функции возвращают результат в виде целого числа (код ошибки). Проверяй эти коды и принимай решения. Это тоже в некотором роде ПРОВЕРКА ИСКЛЮЧЕНИЯ.

Можешь почитать про сигналы . Насколько я помню в С они поддерживаются. Это еще не exceptions но уже более верхний уровень по отношению к коду ошибок. С помощью сигналов можно например проверять сингулярность при делении числа на 0. Это иногда полезно при визуализации графиков.
...
Рейтинг: 0 / 0
как обрабатывать исключительные ситуации в чистом СИ
    #36003019
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сишникЛяназрел вопрос: кто и каким образом обрабатывает исключительные ситуации в чистом СИ?
Вот механизм, являющийся одним из предков исключений: http://ru.wikipedia.org/wiki/Setjmp_(%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F)

сишникЛякакие существуют решения?
Уже сказали: писать, думая.
...
Рейтинг: 0 / 0
как обрабатывать исключительные ситуации в чистом СИ
    #36003129
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer,

setjmp - это жестоко, значительно жестче, чем коды возврата, имхо, конечно, но я бы такого не советовал
...
Рейтинг: 0 / 0
как обрабатывать исключительные ситуации в чистом СИ
    #36003137
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychsetjmp - это жестоко, значительно жестче, чем коды возврата, имхо
Имхо это "жестоко", когда код возврата один. Когда же их надо проверять в каждой из тысяч строк.... я бы всерьёз подумал. Конструкция

Код: plaintext
try {X;} catch (SomeException& e) {Y;}

в целом эквивалентна

Код: plaintext
if (!setjmp (e)) X; else Y;

и если продумать подход и реализовать его в рамках проекта, можно получить очень неплохой выигрыш в читаемости кода и обработке ошибок.
...
Рейтинг: 0 / 0
как обрабатывать исключительные ситуации в чистом СИ
    #36003144
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да не совсем эквивалентна. когда я пишу throw < чего-то там >, то не задумываюсь, где будет перехвачено моё исключение, в случае setjmp/longjmp я контекст должен передавать по цепочке вызовов, есть ещё нюансы, типа "в промежутке между обращениями к setjmp и longjmp не должно быть возврата из функции, вызывавшей setjmp. ". ну и если уж быть совсем откровенным, то правильным будет код обработки вызова setjmp приблизительно такой:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
int catch = setjmp( e );
switch( catch ) {
      case  0 :
         X;
      case  1 :
         Y1;
      case  2 :
         Y2;
      ...
      default:
         exit( catch );
}
, что, по сути, сравнимо с вариантом
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
int catch = X;
switch( catch ) {
      case  1 :
         Y1;
      case  2 :
         Y2;
      ...
      default:
         exit( catch );
}
...
Рейтинг: 0 / 0
как обрабатывать исключительные ситуации в чистом СИ
    #36003145
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerесли продумать подход и реализовать его в рамках проекта, можно получить очень неплохой выигрыш в читаемости кода и обработке ошибок.если продумать единый подход и реализовать его в рамках проекта, то и с кодами ошибок можно сделать читаемый и понятный код, и с исключениями, и с любым другим механизмом... главное слово здесь: продумать , не правда-ли? ))
...
Рейтинг: 0 / 0
как обрабатывать исключительные ситуации в чистом СИ
    #36003155
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychда не совсем эквивалентна. когда я пишу throw < чего-то там >, то не задумываюсь, где будет перехвачено моё исключение, в случае setjmp/longjmp я контекст должен передавать по цепочке вызовов,
Вот ещё тоже :) Я ведь сказал "продумать".

Не надо его передавать. Надо использовать статические переменные. И throw будет именно что не задумываться, где перехвачено. А над setjmp надо сделать обёртку, творящую стек обработчиков.

egorychну и если уж быть совсем откровенным, то правильным будет код обработки вызова setjmp приблизительно такой:
Совершенно не вижу, чем же он правилен. Это напоминает привычку "программировать на новом инструменте как привык на старом".

egorychчто, по сути, сравнимо с вариантом
Не сравнимо из-за разной начинки X. В случае throw/setjmp в X пишется просто логика, а в случае кода возврата - его нужно возвращать по цепочке вызовов, усеивая код бесконечными if. Если без извратов, то в самом простом случае

exceptionserrcode
Код: plaintext
1.
2.
3.
4.
void X() {
  Y(); 
  Z(); 
  T();
}
Код: plaintext
1.
2.
3.
4.
5.
6.
int X() {
  int i; 
  if (i = Y()) return i;
  if (i = Z()) return i;
  if (i = T()) return i;
  return  0 ;
}
...
Рейтинг: 0 / 0
как обрабатывать исключительные ситуации в чистом СИ
    #36003156
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychесли продумать единый подход и реализовать его в рамках проекта, то и с кодами ошибок можно сделать читаемый и понятный код
Вернее сказать, "с кучей дополнительных усилий можно сделать его приемлемым".
...
Рейтинг: 0 / 0
как обрабатывать исключительные ситуации в чистом СИ
    #36003164
avb1003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer...А над setjmp надо сделать обёртку, творящую стек обработчиков.
...
И это все на "чистом СИ"? Именно "чистый СИ" интересовал топикстартера.
Сомнительно, что это вообще возможно, тем более с какой-то пользой для серьезного
проекта.
...
Рейтинг: 0 / 0
как обрабатывать исключительные ситуации в чистом СИ
    #36003254
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avb1003softwarer...А над setjmp надо сделать обёртку, творящую стек обработчиков.
...
И это все на "чистом СИ"?
А в чём проблема? В чистом Си отменили указатели и списки? Две строчки...

avb1003Именно "чистый СИ" интересовал топикстартера.
Сомнительно, что это вообще возможно, тем более с какой-то пользой для серьезного
проекта.
(пожимая плечами) Не скажу за те серьёзные проекты, в которых две строчки вряд ли возможны... Кстати, вчера выпало - и finally такой конструкцией элементарно обеспечивается.
...
Рейтинг: 0 / 0
как обрабатывать исключительные ситуации в чистом СИ
    #36003450
avb1003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwareravb1003softwarer...А над setjmp надо сделать обёртку, творящую стек обработчиков.
...
И это все на "чистом СИ"?
А в чём проблема? В чистом Си отменили указатели и списки? Две строчки...

Две строчки? И жалко было здесь их написать! Или чернила кончились?
А это будет платформно-независимым ?
softwarer
avb1003Именно "чистый СИ" интересовал топикстартера.
Сомнительно, что это вообще возможно, тем более с какой-то пользой для серьезного
проекта.
(пожимая плечами) Не скажу за те серьёзные проекты, в которых две строчки вряд ли возможны... Кстати, вчера выпало - и finally такой конструкцией элементарно обеспечивается.
Нет, если две строчки, то да. Вы успеете из написать, до того как придет Большой Начальник
и спросит:"А, что это Вы тут делаете? А зачем это нам надо?"
...
Рейтинг: 0 / 0
как обрабатывать исключительные ситуации в чистом СИ
    #36006169
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в PostgreSQL используется похожая штука
http://doxygen.postgresql.org/elog_8h-source.html#l00199


--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери
...
Рейтинг: 0 / 0
как обрабатывать исключительные ситуации в чистом СИ
    #36006605
avb1003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ёшв PostgreSQL используется похожая штука
http://doxygen.postgresql.org/elog_8h-source.html#l00199


--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери
Да, но вместо setjmp/longjmp используется "менее стандартная" пара sigsetjmp/siglongjmp
и "решение" длиннее двух строк. Его не так легко позаимствовать и не очевидно, насколько оно
подойдет для конкретного проекта.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / как обрабатывать исключительные ситуации в чистом СИ
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]