Обработка исключительных ситуаций на языке программирования Си

SashaMercury
Дата: 16.02.2015 02:48:37
Здравствуйте.
Не так давно у меня возникал вопрос о правильном выходе из программы в случае заполнения стека. Сегодня я размышлял об исключениях.

Первый вопрос, нужны ли исключения ?
1.1 Мне кажется, что существует два типа исключений: исключения программиста(к этому классу я отнесу исключения возникающие в результате работы пользователя, и возникновения нестандартной ситуации, которую не предусмотрел программист, т.е. я рассматриваю идеального программиста. впрочем, если бы я рассматривал не идеального программиста, то возможный третий класс исключений-"пользовательские исключения", всё равно был бы подклассом исключений по вине программиста), и исключения независимые от программиста.
1.1.2 Существует ли первый класс исключений ? Да, существует. Какие исключения принадлежат этому классу ? Вероятно это такие ситуации, когда программист хочет чтобы поток выполнения программы кардинальным образом (думаю вы понимаете о чём я, например функция возвращает целое число, возвращать целое в качестве ошибки неправильно, мы должны сделать что-то другое) менялся.
1.1.2.1 Существует ли подкласс пользовательских исключений в Исключениях программиста ? Фактически, вопрос такой, можно ли спроектировать программу в рамках существующей архитектуры ЭВМ таким образом, чтобы не возникало нештатных ситуаций в которых требовалось бы кардинальным образом менять поток выполнения программы ? Не знаю, но даже если существует, все эти ситуации могут быть отнесены к пункту 1.1.2

1.2 Существуют ли Исключения независимые от программиста (в рамках существующей организации ЭВМ)? Думаю да. Например, ограничение по памяти. Существуют ли такие ограничения в абстрактной идеальной модели ЭВМ ? Не знаю.

1.3 Ситуации при которых должны возникать исключения в современных ЭВМ скорее всего действительно существуют, и возникают не в силу слабых алгоритмов или слабых программистов, а в силу организации ЭВМ. Каким образом должна быть спроектирована ВМ в которой исключений(в настоящем их понимании) не было ? Наверное таким, при котором они будут нормой. А может быть иначе. Но я уверен в том, что исключения (в сегодняшнем их понимании) это проблема ВМ, и только во вторую очередь это проблема языка.

2.1 Почему в языке программирования Си отсутствует встроенный механизм обработки ситуаций, при которых необходимо кардинальное изменение потока программы ?
2.2 Это можно сделать относительно корректным образом только с помощью сигналов ? (не интересны варианты с резервированием констант для возврата, и аналогичные)

Вопросы 2.1 и 2.2 относятся только к языку программирования Си.
Подскажите пожалуйста
Anatoly Moskovsky
Дата: 16.02.2015 04:01:54
SashaMercury
2.1 Почему в языке программирования Си отсутствует встроенный механизм обработки ситуаций, при которых необходимо кардинальное изменение потока программы ?

Потому что в С нет уборки мусора или деструкторов, и при автоматической раскрутке стека происходили бы утечки ресурсов, что трудно было бы назвать корректной обработкой исключения )).
SashaMercury
Дата: 16.02.2015 04:13:24
Anatoly Moskovsky
SashaMercury
2.1 Почему в языке программирования Си отсутствует встроенный механизм обработки ситуаций, при которых необходимо кардинальное изменение потока программы ?

Потому что в С нет уборки мусора или деструкторов, и при автоматической раскрутке стека происходили бы утечки ресурсов, что трудно было бы назвать корректной обработкой исключения )).


То есть в Си нет такого механизма потому что язык Си реализован на языке Си ?
White Owl
Дата: 16.02.2015 06:51:58
Саша, читай Таненбаума. Это чрезвычайно полезно и снимет множество твоих вопросов. А если еще и поймешь его, то не будет нужды фантазировать.

SashaMercury
Первый вопрос, нужны ли исключения ?
Нет.

SashaMercury
1.1 Мне кажется, что существует два типа исключений: исключения программиста(к этому классу я отнесу исключения возникающие в результате работы пользователя, и возникновения нестандартной ситуации, которую не предусмотрел программист, т.е. я рассматриваю идеального программиста. впрочем, если бы я рассматривал не идеального программиста, то возможный третий класс исключений-"пользовательские исключения", всё равно был бы подклассом исключений по вине программиста), и исключения независимые от программиста.
1.1.2 Существует ли первый класс исключений ? Да, существует. Какие исключения принадлежат этому классу ? Вероятно это такие ситуации, когда программист хочет чтобы поток выполнения программы кардинальным образом (думаю вы понимаете о чём я, например функция возвращает целое число, возвращать целое в качестве ошибки неправильно, мы должны сделать что-то другое) менялся.
1.1.2.1 Существует ли подкласс пользовательских исключений в Исключениях программиста ? Фактически, вопрос такой, можно ли спроектировать программу в рамках существующей архитектуры ЭВМ таким образом, чтобы не возникало нештатных ситуаций в которых требовалось бы кардинальным образом менять поток выполнения программы ? Не знаю, но даже если существует, все эти ситуации могут быть отнесены к пункту 1.1.2
эээээ..... чего?
Пожалуйста, прочитай учебник. Ну просто жуть берет от фантазий. Не, фантазировать это кончено полезно, но лучше фантазировать на основе реальных знаний.
Так что бери Таненбаума и читай до просветления.

SashaMercury
2.1 Почему в языке программирования Си отсутствует встроенный механизм обработки ситуаций, при которых необходимо кардинальное изменение потока программы ?
Потому что этот механизм не являются абсолютно необходимой вещью. К тому-же, этот ЯП развивался из другого языка (B) который был почти что макро-ассемблером.
Почему исключения не добавили в язык в более поздних редакциях? Опять таки: а зачем? Как показала жизнь, можно прекрасно жить без них.
И да, вполне возможно, что в следующей редакции языка Си введут подержку исключений на уровне языка. Вот только Си развивается по факту (что полезно и без чего трудно жить - добавим, остальное нафиг). Так что я очень сомневаюсь что механизм исключений введут в Си.

SashaMercury
2.2 Это можно сделать относительно корректным образом только с помощью сигналов ? (не интересны варианты с резервированием констант для возврата, и аналогичные)
Система сигналов не является аналогом для языковых исключений. Сигналы это исключения уровня ОС.
Так что единственный "корректный" аналог для исключений в Си это будет множество goto в паре с глобальным объектом "исключение". Пример такого глобального объекта - смотри WinAPI с его GetLastError() функцией. Вынеси обработку ошибок в один общий блок под меткой, и делай goto на эту метку если какая-то функция завершилась с ошибкой.
SashaMercury
Дата: 16.02.2015 07:25:44
White Owl,
что именно вам не нравится в той классификации что я привёл ? Да, эта классификация интуитивная, но всё-же. Почему нельзя классифицировать так ?

White Owl
Как показала жизнь, можно прекрасно жить без них.

Как показал мой вопрос об извлечении данных из стека, на Си нет нормальных решений данной проблемы. Сигналы не проверял правда. Мне неизвестен механизм их работы, но это возможно не относится к теме этого разговора
SashaMercury
Дата: 16.02.2015 07:32:42
Усиление проектирования, в смысле усложнения алгоритма за счёт побочных моментов(например запись значения в какую-либо переменную, а не возврат значения из функции), не должно влиять на алгоритм. А эти ухищрения, что позволяют обойтись без исключений, именно этим и занимаются. Усложняют алгоритм не в том месте. Анатолий, например, сам не раз предлагал разделять работу с памятью, и алгоритм. Да, вероятно для возврата значения при извлечении данных из стека можно написать оболочку, но стоит ли это того ? Сколько этих оболочек будет в больших проектах ? Думаю что много.

И если вы говорите что можно обойтись без механизма исключений, то расскажите подробней об этом, пожалуйста. Можно ведь обойтись и без языков высокого уровня, и писать на ассемблере, но зачем ? Если без чего-то можно обойтись, то хорошо было бы обойтись без этого с преимуществами, а не с потерями
White Owl
Дата: 16.02.2015 07:42:29
SashaMercury
White Owl,
что именно вам не нравится в той классификации что я привёл ? Да, эта классификация интуитивная, но всё-же. Почему нельзя классифицировать так ?
Потому что это не классификация а .... у меня нет цензурных слов. В нормальной классификации есть четкое обозначение что "это" есть и чем оно отличается от "вон того". В твоем описании этого всего нету.
Во вторых, если уж ты выделяешь "исключения независимые от программиста" (что это такое?), то альтернативной группой должны быть "исключения зависимые от программиста" (но по твоему описанию они как раз таки независимые). В общем.... не доразмышлял ты...

SashaMercury
White Owl
Как показала жизнь, можно прекрасно жить без них.

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

SashaMercury
Сигналы не проверял правда. Мне неизвестен механизм их работы, но это возможно не относится к теме этого разговора
Вот, а прочитал бы Таненбаума, знал бы что сигналы это исключения уровня ОС. И с ем их едят и насколько они зависимые или независимые от программиста.
SashaMercury
Дата: 16.02.2015 07:46:01
White Owl
SashaMercury
White Owl,
что именно вам не нравится в той классификации что я привёл ? Да, эта классификация интуитивная, но всё-же. Почему нельзя классифицировать так ?
Потому что это не классификация а .... у меня нет цензурных слов. В нормальной классификации есть четкое обозначение что "это" есть и чем оно отличается от "вон того". В твоем описании этого всего нету.
Во вторых, если уж ты выделяешь "исключения независимые от программиста" (что это такое?), то альтернативной группой должны быть "исключения зависимые от программиста" (но по твоему описанию они как раз таки независимые). В общем.... не доразмышлял ты...

SashaMercury
пропущено...

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

SashaMercury
Сигналы не проверял правда. Мне неизвестен механизм их работы, но это возможно не относится к теме этого разговора
Вот, а прочитал бы Таненбаума, знал бы что сигналы это исключения уровня ОС. И с ем их едят и насколько они зависимые или независимые от программиста.



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

Хорошо, позже я его обязательно прочитаю :) Modern Operating Systems ?
White Owl
Дата: 16.02.2015 07:49:43
SashaMercury
И если вы говорите что можно обойтись без механизма исключений, то расскажите подробней об этом, пожалуйста.
Зачем об этом говорить, если можно просто взять ЯП без исключений и писать на нем? Бери и пиши. Если ты почуствуешь что можешь писать и тебе удобно - то вот и ответ. Неудобно? Возьми другой язык. Третий, четвертый... Пока не найдешь себе язык по вкусу.
SashaMercury
Можно ведь обойтись и без языков высокого уровня, и писать на ассемблере, но зачем ? Если без чего-то можно обойтись, то хорошо было бы обойтись без этого с преимуществами, а не с потерями
А почему ты считаешь что писать на ассемблере это писать с потерями?
White Owl
Дата: 16.02.2015 07:54:30
SashaMercury
Хорошо, позже я его обязательно прочитаю :) Modern Operating Systems ?

Не позже, а прямо сейчас. Ты уже дозрел и уперся в проблемы которые он подробно и качественно освещает.
А читать у него надо все. Начать можно с MOS, но и остальные его книги чрезвычайно полезные.