LINUX.ORG.RU

Go и обработка ошибок

 


0

2

Вот недавно опять решил посмотреть, что там новенького в Go, и наткнулся на следующую статью: https://blog.golang.org/errors-are-values. В ней рассказывается, как в Go обрабатывать ошибки. Типа: «некоторые товарищи» утверждают, что приходится очень часто писать «if err != nil». Они неправы! Мы предлагаем этим товарищам парочку костылей, которые исправят их походку.

Ещё один момент. В Go FAQ (yourself :) написано: «We believe that coupling exceptions to a control structure, as in the try-catch-finally idiom, results in convoluted code.» Как-то мне кажется, что с «if err != nil» на каждом шагу код получается не менее convoluted.

Однако, что-же получается? В Go те же самые проблемы при обработке ошибок, что и в C? В Go, как и в C надо постоянно проверять статус ошибки. А если забыл, то тебя ждут те же самые приятные ощущения, что и в C. Где прогресс, спрашивается? Почему через 30 лет Роб Пайк и Кен Томпсон ничего лучше не придумали? Ведь есть же языки, где такой хернёй заниматься не надо.

★★★★★

Последнее исправление: cetjs2 (всего исправлений: 2)

Почему через 30 лет Роб Пайк и Кен Томпсон ничего лучше не придумали?

Ну, в Go по крайней мере можно возвращать из функций несколько значений - это несколько упрощает жизнь. Но вообще говно, да.

tailgunner ★★★★★
()

А если забыл, то тебя ждут те же самые приятные ощущения, что и в C.

Не те же.

anonymous
()

(Гляда на тред) Это ещё не успели повылезать любители плюсовой раскрутки стека, они тоже могут изрядно неадквата добавить.

nezamudich ★★
()
Ответ на: комментарий от nezamudich

(Гляда на тред) Это ещё не успели повылезать любители плюсовой раскрутки стека, они тоже могут изрядно неадквата добавить.

(вылез) Да, тяжко людям без исключений и RAII. (залез обратно)

anonymous
()

Это они так форсят идею того, что все ошибки по-хорошему нужно обрабатывать, а не пускать на самотёк.

mix_mix ★★★★★
()
Ответ на: комментарий от mix_mix

Но в большинстве случаев, ошибки обрабатываются не сразу, а на несколько уровней выше по стеку, куда, в случае кодов возврата, их приходится протаскивать в ручную. Т.е. получается так, что «if err != nil { return err }» начинает захламлять код, и приходится придумывать всякие выкрутасы. Что нельзя было сделать механизм, который автоматизирует проброс ошибки на нужный уровень, где она будет обработана?

rupert ★★★★★
() автор топика
Ответ на: комментарий от rupert

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

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

mv ★★★★★
()
Ответ на: комментарий от rupert

Подобный проброс - это то же самое, что и GOTO неизвестно откуда неизвестно куда. Это делает программу сложнее.

anonymous
()
Ответ на: комментарий от anonymous

Да, тяжко людям без исключений и RAII

Не не так. Тяжко без HANDLER-BIND и RESTART-CASE/INVOKE-RESTART.

Oxdeadbeef ★★★
()
Ответ на: комментарий от mv

Кроме сишечки и общелиспа, по сути, ничего более не надобно

Да и сишечка с общелиспом, в сущности...

tailgunner ★★★★★
()
Ответ на: комментарий от nezamudich

mv же считает, что без общелиспа не нашёл бы себе хорошей работы. Поэтому восхвалять его будет до самой пенсии.

Это не восхваление,а конструктивный диалог.

У меня работа всегда хорошая. На нехорошей работе я не работаю.

mv ★★★★★
()

В go есть исключения. см. panic, recover. Правда придётся на границе между стандартной библиотекой и своей программой проверять ошибки или врапперы понаписать (или вообще переписать стандартную библиотеку). Единственная засада — надо смотреть, чтобы к коду близко не подошёл идиоматичный гофер, иначе может искусать.

Legioner ★★★★★
()

Почему через 30 лет Роб Пайк и Кен Томпсон ничего лучше не придумали?

По той же причине, из-за которой в Go нет параметризованных типов, нормального полиморфизма с возможностью перегрузки операторов, темплейтов/макросов и других фич, которые появились или стали популярными в последние 30 лет.

hateyoufeel ★★★★★
()
Ответ на: комментарий от hateyoufeel

Жалко, что Пайк и Томпсон застряли в 80-х. Мне нравятся в Go channel-ы. Самому что-ли написать такую штуку на C++?

rupert ★★★★★
() автор топика
Ответ на: комментарий от rupert

Жалко, что Пайк и Томпсон застряли в 80-х.

В 80-х уже было метапрограммирование и прочие ништяки. Я бы сказал, это 70-е.

Мне нравятся в Go channel-ы. Самому что-ли написать такую штуку на C++?

Таких штук для C++ уже дофига. Бери любую.

hateyoufeel ★★★★★
()
Ответ на: комментарий от hateyoufeel

К каналам ещё планировщик корутин бы нужен, просто так в них не очень много смысла, да и для этого zmq есть.

mix_mix ★★★★★
()
Ответ на: комментарий от hateyoufeel

В 80-х уже было метапрограммирование и прочие ништяки. Я бы сказал, это 70-е.

В общем-то в 70-х тоже уже было. И, AFAIK, Go специально был придуман «топорным», чтобы его компилятор было легко и просто реализовать. Видимо, испугались судьбы D.

korvin_ ★★★★★
()
Ответ на: комментарий от korvin_

Не то. Автор не сумел воспроизвести простоту Go channel-ов.

rupert ★★★★★
() автор топика
20 августа 2016 г.
Ответ на: комментарий от mv

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

Прочитал сейчас 19-ю главу PCL. Надо признать, неплохо в общелиспе зделоли.

Думаю, такое и на C++ замутить можно. Возможно, понадобится лезть в ABI за каким-нибудь can_catch...
Скорее всего, это будет малоюзабельно за пределами наколенных локалхостовых «проектов». Последнее, впрочем, только усилит сходство с лиспом, б-г-г.

utf8nowhere ★★★
()
Ответ на: комментарий от rupert

В Go весьма примитивные каналы. Что реально ценно — это легковестность go-роутин, их планировщик и конструкция select.

eao197 ★★★★★
()
Ответ на: комментарий от mv

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

Хотя, ничего особого делать, как я предположил в предыдущем комментарии (в ABI погружаться), не нужно. В C++ кондишены и рестарты легко реализуемы имеющимися средствами языка и весьма дёшево.

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

Резюме: общелисп ненужен :-)

utf8nowhere ★★★
()

Фу такими быть

Теоретики неосиляторы. Golang божественный!

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.