?

Log in

No account? Create an account
 
 
27 April 2010 @ 02:38 pm
Записки программиста  
Давно казалось, что чего-то мне не хватает в жизни.
И понял: вышло написать пару раз "goto" и стал чувствовать себя лучше :)

А еще - тут (в Yahoo) email-дискуссия, где какой-то человек (кстати, русский) спорит, что в С++ ошибки,
вызванные, скажем, безумными пойнтерами переводить в exceptions очень плохо. И я не включился
Старею - раньше мне в подобных случаях трудно было удержаться. Помню немало времени в свое
время потратил в usenete ругаясь с теми, кто утверждал, то же про assert - требуя, чтобы ну прямо нельзя
было перехватить управление, если assert  :)

Доводы всегда примерно такие. Если assert (или что-то аналогичное), значит в программе ошибка! А, раз

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

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

 
 
 
Artificial Intelligentargent_smith on April 28th, 2010 06:13 am (UTC)
Ошибка == исключение, исключение != ошибке

Я в OCaml'е довольно часто пользуюсь исключениями для сложных императивных кренделей. Ассертами реже, и в основном как заглушками до окончательного вылизывания. Но как это в сях, не уверен, что знаю.
Misha Furmanmishafurman on April 28th, 2010 05:54 pm (UTC)
[почти ничего не знвю про OCaml, но сути это менять не должно]

Но, это утверждение подвергается критике легче: это как сравнение "яблок и апельсинов". Ошибки и исключения (exceptions) - вещи, ну, совершенно разных категорий.

С исключениями проще - это инструмент, некоторая конструкция языка программирования для управления ходом выполнения программы (из того же клавва, как if, return, break, goto итд. Assert - примерно то же по идее и традиционно используется для отладки - так сказать ловли ошибок.

Ошибка - это, вероятно, философская категория. И, что считать ошибкой, а что нет - вопрос иногда непростой.

Но, конечно, Ваше заголовочное утверждение навеяно известным программистским рецептом, который я упоминал в своем посте.

В его "логическом" обосновании есть изъян, хотя он и годится для некоторого класса задач...
Misha Furmanmishafurman on April 29th, 2010 04:38 am (UTC)
Ответ
Что-то с ответами небогато...

Надо будет написать на эту тему поподробнее как-нибудь, но коротко:

В рассуждении используются два пониятия "программа" и "ошибка", которые могут быть определены по-разному.
Программа, в во многих случаях не одна. Или, если считать, что одна - то имеет сложную структуру и компоненты ее могут быть очень разными.
И ошибка - понятие очень расплывчатое. Одно и то же может может рассматриваться и как ошибка и как просто особая, исключительная ситуация - на разных уровенях абстракции или с точки зрения разных компонент.

С точки зрения одной компоненты ошибкой может быть попытка деления на 0 (скажем программист при вычмсление функции не предусмотрел некоторых случаев).

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