The OpenNET Project / Index page

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



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Выпуск языка программирования Go 1.7, opennews (??), 16-Авг-16, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


60. "Выпуск языка программирования Go 1.7"  –1 +/
Сообщение от Crazy Alex (ok), 16-Авг-16, 17:39 
Сюрприз - исключения - это и есть значения. В тех же плюсах ты можешь throw хоть int, хоть SuperMegaObject. И имеешь абсолютно всё, чтобы обработать исключительную ситуацию. И ты не понял главную фишку исключений - автоматическую очистку при выходе из скопа. Вот ты открл файл, добавил данные в структуру, отданную как аргумнт, ещё что-то - и теперь при каждом выходе при ошибке ты должен сообразить, что в этой точке уже сделано и что надо откатывать. С исключениями же всё, что тебе нужно сделать - обработать выход из скопа. И то, что в вышеуказанной статейке приходится костылить, с исключениями ты имеешь из коробки.

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

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

71. "Выпуск языка программирования 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ообщить модератору

75. "Выпуск языка программирования Go 1.7"  +/
Сообщение от Crazy Alex (ok), 16-Авг-16, 19:22 
Дык и в Go можно возвращать bool и терять всё и вся. Или вообще ошибку не возвращать. Суть в том, что в плюсах МОЖНО вернуть всё, что угодно. То есть байки насчёт "обязательно потеряете контекст" - враньё. И из моего опыта очень мало ситуаций, когда есть смысл обрабатывать ошибку там же, где она возникла - подняться по стеку на пару-тройку уровней приходится почти всегда. С "if (err) return" мусора получается катастрофически много.

И там, где в "a = foo(b + c)" может быть три исключения - в Go ровно те же три ошибки будут - с поправкой на неудобную запись вида a.set(foo(add(b, c))).

defer - хорошо, но это если код запаникует. А на ошибки придётся таки закрывать его явно?

Кстати, ровно наоборот - именно для скриптоподобного кода вообще плевать, где и как делать обработку - а вот когда код сложный, загромождать его обработкой ошибок, да ещё так, что её не может опознать и спрятать IDE - значит усложнить понимание кода. И я бы не называл обработку ошибок в стиле "if (err) return" явной - она не более явная, чем исключения - только, в отличие от них, никак от основной логики не отделена.

Ещё раз - исключения не прерывают исполнение и не "падают с красивым стектрейсом".Это вы чего-то решили, что их никто не обрабатывает. Наоборот - в отличие от возвращаемой ошибки исключения сложно проигнорировать, тем более - так, чтобы это было не видно на ревью.

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

103. "Выпуск языка программирования Go 1.7"  –1 +/
Сообщение от angra (ok), 17-Авг-16, 09:32 
> с поправкой на неудобную запись вида a.set(foo(add(b, c))).
> defer - хорошо, но это если код запаникует. А на ошибки придётся
> таки закрывать его явно?

Ты явно не знаешь Go, так зачем же ты лезешь в это обсуждение?

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

110. "Выпуск языка программирования Go 1.7"  +/
Сообщение от freehckemail (ok), 17-Авг-16, 12:04 
> Ты явно не знаешь Go, так зачем же ты лезешь в это обсуждение?

Берём томик Толстого. Находим во всём повествовании одну крайне сомнительную строчку. "Толстой явно не знал жизни, зачем же он написал такой толмуд"?

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

111. "Выпуск языка программирования Go 1.7"  +/
Сообщение от angra (ok), 17-Авг-16, 13:37 
Я смотрю ты мастер передергивания 80-го уровня.
Ответить | Правка | Наверх | Cообщить модератору

132. "Выпуск языка программирования Go 1.7"  +/
Сообщение от Аноним (-), 18-Авг-16, 20:11 
в гугле не ищется. видимо, кроме слова "толмуд" допущены и другие ошибки.
Ответить | Правка | К родителю #110 | Наверх | Cообщить модератору

90. "Выпуск языка программирования Go 1.7"  +1 +/
Сообщение от Аноним (-), 16-Авг-16, 21:55 
в си есть goto какраз для обработки ошибок
Ответить | Правка | К родителю #60 | Наверх | Cообщить модератору

100. "Выпуск языка программирования Go 1.7"  +1 +/
Сообщение от Аноним (-), 17-Авг-16, 03:13 
ОТкрой для себя longjump
Ответить | Правка | К родителю #60 | Наверх | Cообщить модератору

123. "Выпуск языка программирования Go 1.7"  +/
Сообщение от Crazy Alex (ok), 18-Авг-16, 00:02 
Открой для себя чудеса отладки с longjump
Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




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

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