Илья
http://xahlee.info/comp/why_i_hate_exceptions.html
Алексей
http://xahlee.info/comp/why_i_hate_exceptions.html
basically, exceptions are invisible gotos уже можно поспорить
Andrei 🦉
Andrey
а, старые данные значит
Andrei 🦉
в swift говорят нету тоже
а еще там есть паттернг матчинг и еще очень много всякого вкусного, не зря его сейчас активно тянут в серверную разработку
Илья
basically, exceptions are invisible gotos уже можно поспорить
о чем спорить? вы в чатике про го уже не первый раз и не первый час описываете свою боль, и то, что вы не осилили го. Я не понимаю почему и зачем
Vladimir
Я в своем коде каждую ошибку оборачиваю в другую ошибку с доп информацией, которую считаю нужной (метка места возникновения, может переменные, может текст), и ее уже возвращаю. Типа myerrors.New(“myfunc: err with path: “, path, err). Такая вот эмуляция стектрейса. В конечном счете жить можно.
Andrei 🦉
вообще то есть
хотя нет, это не экспешены в том смысле, в котором это реализованно в других языках, это специальные возвращаемые значения, которые по-умолчанию пробрасываются вверх по стеку
Andrei 🦉
короче реализация обработки ошибок близка к идеальной
Andrei 🦉
https://docs.swift.org/swift-book/LanguageGuide/ErrorHandling.html кому интересно
Vladimir
А вообще, к го2 подумывают что-то с ошибками сделать (сделать их типизированными вроде), но это не точно)
Andrei 🦉
А вообще, к го2 подумывают что-то с ошибками сделать (сделать их типизированными вроде), но это не точно)
go2 еще даже не на горизонте, а до его выхода уже столько всего понапишут, что переход индустрии с питона 2го на питон 3ий покажется легкой прогулкой
Aid
А вообще, к го2 подумывают что-то с ошибками сделать (сделать их типизированными вроде), но это не точно)
https://github.com/golang/go/issues/21161 обсуждение идет с прошлого года, много разных идей
Антон
вы переходили с питона 2 на 3? знаете что там было камнем преткновения?
То, что третий питон не обладает тьюринг-полнотой?
Илья
То, что третий питон не обладает тьюринг-полнотой?
о, добрый день, как там дела в том языке, где все есть? :)
Vladimir
хм, а сейчас ошибки нетипизированные?
errors.New() - просто текст. В стандертной либе некоторые с доп кодами.
Andrei 🦉
вы переходили с питона 2 на 3? знаете что там было камнем преткновения?
в основном изменения в строках и изменения в стандартной либе, когда функции начала возвращать генераторы, там где раньше возвращались коллекции
Илья
errors.New() - просто текст. В стандертной либе некоторые с доп кодами.
что вам мешает использовать типизированные ошибки? реализовать интерфейс error очень просто, можете не благодарить
Антон
Алексей
А зря
Илья
Тем, что из интерфейса в общем случае типизированную ошибку ты не достанешь
можно развернуто? в общем случае, имеется ввиду division by zero и прочее? то есть не руками сделанные ошибки?
Andrey
err != nil перестанет работать
Andrey
потому что интерфейс
Илья
??????
Антон
а через switch проходится по типу ошибки (структуры)?
А где гарантия, что ты переберёшь все возможные типы ошибок, возвращаемые из функции?
Denis
А где гарантия, что ты переберёшь все возможные типы ошибок, возвращаемые из функции?
скорее это для того чтобы отловить некоторые специфичные виды ошибок, а стандартное поведение будет в default
Denis
потому что интерфейс
https://blog.golang.org/error-handling-and-go тут есть примеры
Andrey
??????
https://divan.github.io/posts/avoid_gotchas/#interfaces
Илья
А где гарантия, что ты переберёшь все возможные типы ошибок, возвращаемые из функции?
хм, а в языке, который нельзя называть, тебя обязывают обработать все возможные типы ошибок? :O
Илья
гуд джоб, наверное
Denis
А что в default?
стандартное поведение P.S - типизированые ошибки я рассмартриваю исключительно как контейнер с доп. информацией об ошибке, напр. последний запрос с БД который отвалился или что то еще
Илья
https://divan.github.io/posts/avoid_gotchas/#interfaces
что именно? nil interface? возращаете nil, когда ошибки нет, и все будет ОК
Denis
что именно? nil interface? возращаете nil, когда ошибки нет, и все будет ОК
Раз уж мы заговорили об ошибках, есть какой то способ обернуть обработку ошибок, чтобы 30% кода не состояло из if err != nil
Denis
как Result в расте
Илья
Раз уж мы заговорили об ошибках, есть какой то способ обернуть обработку ошибок, чтобы 30% кода не состояло из if err != nil
насколько я знаю нет, но вы что-то делаете не так, или у вас проект из 10 строк, если 30% кода if err != nil
Антон
как Result в расте
Без try! или ? обработка ошибок была бы столь же многословной, как и в Go
Andrey
что именно? nil interface? возращаете nil, когда ошибки нет, и все будет ОК
я ж вам ссылку дал. если вы возвращаете типизированную ошибку без проверки, и внутри неё nil, то она на пройдёт стандартную проверку err != nil
Denis
насколько я знаю нет, но вы что-то делаете не так, или у вас проект из 10 строк, если 30% кода if err != nil
немного утрировал, но err возвращается очень часто даже там где его и не предполагалось быть, в тех же функциях хеширования например
Denis
с одной стороны можно забить и юзать _ но это не по канону
Илья
иногда и правда зря есть возврат ошибки, бывает
Илья
обычно такое сделано для реализации стандартных интерфейсов, и, помоему, не всегда осмысленно
Andrey
попробуйте сказать, какая ветка выполнится до Run
Andrey
именно поэтому вам нельзя возвращать типизированную ошибку, только интерфейс
Andrey
ну или можно, если ваш код видите только вы
Илья
https://play.golang.org/p/BB1b2_HDb6I
https://play.golang.org/p/R9Jg_9-PyM4
Илья
можно и нужно возвращать типизированные ошибки
Andrey
так вы интерфейс возвращаете
Andrey
что вам даст типизированная ошибка, если внешний код видит только метод Error()?
Andrey
придётся кастовать
Илья
эм, а паттерн матчинг что делает по вашему?
Andrey
а при чём здесь это?
Andrey
я же про то, что если вы пишите библиотеку, например, то передача error ничего не даст
Илья
при том, что так работают с типизированными ошибками в go
Илья
https://dave.cheney.net/2016/04/27/dont-just-check-errors-handle-them-gracefully
Andrey
хорошая статья, читал когда-то
Andrey
вы её тоже читали, надеюсь?
BRZ
всем доброго времени суток есть структура type MyTable struct { name string Id int } есть запрос в БД SELECT name, array_agg(id) from my_tables group by name; есть описанная модель в go-pg Вопрос: Могу ли я получить array_agg через модель go-pg или придется делать обычный запрос через Exec или Query
Илья
вы её тоже читали, надеюсь?
вы, видимо, на этом остановились, и читать дальше не стали
Andrey
так мы с вами про типизированные ошибки спорим. нет разве?
Andrey
просто вы дали этот совет как панацею
Илья
вы думаете, каким именно образом, обеспечивается этот механизм?
Andrey
ну ок, значит я вас неправильно понял. Я подумал, что вы предлагаете тупо возвращать тип, который удовлетворяет интерфейсу error