The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



"Выпуск языка программирования Go 1.7"
Версия для распечатки Пред. тема | След. тема
Форум Разговоры, обсуждение новостей
Исходное сообщение [ Отслеживать ]
Присылайте удачные настройки в раздел примеров файлов конфигурации на WIKI.opennet.ru.
. "Выпуск языка программирования Go 1.7" +/
Сообщение от Пользователь Debian (?), 16-Авг-16, 18:30 
> Сюрприз - исключения - это и есть значения. В тех же плюсах
> ты можешь throw хоть int, хоть SuperMegaObject. И имеешь абсолютно всё,
> чтобы обработать исключительную ситуацию.

Это типичное заблуждение.
"Ты" имеешь только то, что передано в брошенном значении и -- всё.
Точнее, если тебе повезло с ЯП, ты имеешь ещё трейс стека в том месте,
где исключение "положило" тебе приложение (потому что в большинстве случаев они
именно так и "обрабатываются" (ну, то есть я, естественно уверен, что именно Вы
их обрабатываете по-другому, но я вижу много реального кода вокруг себя, который
писали не Вы, и там они "обрабатываются" как я написал выше)).

Проблема в том, что в той точке, в которой ловится исключение, о его _контексте_
не известно совершенно ничего, и в основном всё, что с ним можно сделать полезного,
это его запротоколировать.

А реальная проблема состоит в том, что в ЯП с широкой поддержкой исключений исключения
кидаются _абсолютно на всё_, и если у вас в C++ есть вот такой код:

  a = foo(b + c);

то исключение может быть брошено минимум в трёх местах.
А это означает, что вменяемой обработки ошибок быть не может.  То, что у вас есть,
это иллюзия контроля над ситуацией.

> И ты не понял главную фишку исключений
> - автоматическую очистку при выходе из скопа. Вот ты открл файл,
> добавил данные в структуру, отданную как аргумнт, ещё что-то - и
> теперь при каждом выходе при ошибке ты должен сообразить, что в
> этой точке уже сделано и что надо откатывать. С исключениями же
> всё, что тебе нужно сделать - обработать выход из скопа. И
> то, что в вышеуказанной статейке приходится костылить, с исключениями ты имеешь
> из коробки.

Ну, на Go мы так и пишем:

  f, err = os.Open("blah.txt)
  defer f.Close()
  // Если какой-то код запаникует начиная с этой точки,
  // файл будет закрыт в ходе раскрутки стека.

> Прямо передо мной здоровенный сишный проект. Одна из самых больших его проблем
> - именно возня с обработкой ошибок, процентов 80 из которых идут
> вверх по стеку уровней на 5. Ну просто потому что хороший
> стиль - это таки много мелких специализированных функций. Что с необходимостью
> предполагает, что большинство ошибок форвардится.

Я ни в коем случае не спорю, что явная обработка ошибок это free lunch.
Более того, я считаю, что в "скриптоподобном" коде исключения, которые прерывают
выполнение это именно то, что нужно.
Но не в сложном коде, у которого задача -- работать, а не падать с красивым стектрейсом.

Ответить | Правка | Наверх | Cообщить модератору

Оглавление
Выпуск языка программирования Go 1.7, opennews, 16-Авг-16, 09:47  [смотреть все]
Форумы | Темы | Пред. тема | След. тема



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру