> Сюрприз - исключения - это и есть значения. В тех же плюсах
> ты можешь throw хоть int, хоть SuperMegaObject. И имеешь абсолютно всё,
> чтобы обработать исключительную ситуацию.Это типичное заблуждение.
"Ты" имеешь только то, что передано в брошенном значении и -- всё.
Точнее, если тебе повезло с ЯП, ты имеешь ещё трейс стека в том месте,
где исключение "положило" тебе приложение (потому что в большинстве случаев они
именно так и "обрабатываются" (ну, то есть я, естественно уверен, что именно Вы
их обрабатываете по-другому, но я вижу много реального кода вокруг себя, который
писали не Вы, и там они "обрабатываются" как я написал выше)).
Проблема в том, что в той точке, в которой ловится исключение, о его _контексте_
не известно совершенно ничего, и в основном всё, что с ним можно сделать полезного,
это его запротоколировать.
А реальная проблема состоит в том, что в ЯП с широкой поддержкой исключений исключения
кидаются _абсолютно на всё_, и если у вас в C++ есть вот такой код:
a = foo(b + c);
то исключение может быть брошено минимум в трёх местах.
А это означает, что вменяемой обработки ошибок быть не может. То, что у вас есть,
это иллюзия контроля над ситуацией.
> И ты не понял главную фишку исключений
> - автоматическую очистку при выходе из скопа. Вот ты открл файл,
> добавил данные в структуру, отданную как аргумнт, ещё что-то - и
> теперь при каждом выходе при ошибке ты должен сообразить, что в
> этой точке уже сделано и что надо откатывать. С исключениями же
> всё, что тебе нужно сделать - обработать выход из скопа. И
> то, что в вышеуказанной статейке приходится костылить, с исключениями ты имеешь
> из коробки.
Ну, на Go мы так и пишем:
f, err = os.Open("blah.txt)
defer f.Close()
// Если какой-то код запаникует начиная с этой точки,
// файл будет закрыт в ходе раскрутки стека.
> Прямо передо мной здоровенный сишный проект. Одна из самых больших его проблем
> - именно возня с обработкой ошибок, процентов 80 из которых идут
> вверх по стеку уровней на 5. Ну просто потому что хороший
> стиль - это таки много мелких специализированных функций. Что с необходимостью
> предполагает, что большинство ошибок форвардится.
Я ни в коем случае не спорю, что явная обработка ошибок это free lunch.
Более того, я считаю, что в "скриптоподобном" коде исключения, которые прерывают
выполнение это именно то, что нужно.
Но не в сложном коде, у которого задача -- работать, а не падать с красивым стектрейсом.