Pull to refresh

Comments 28

В принципе если не считать примеры на Go, то статья "6 рекомендаций по разработке безопасных <подставьте свое>-приложений"

Тогда получится статья из прошлого примерно 15-летней давности.
ну а шестой пункт — «напрягайте булки, ведь ГОшка не умеет в исключения: берегите ноги»)))
Первое, что тут стоит учитывать, заключается в том, что в Go нет исключений.

Кто нибудь может объяснить чем panic не exception? Только тем что их не вызывают по поводу и без?


Каждый раз такие зявления глаз режут.

Формально panic нельзя обработать

Ждал этого вопроса, но это не обработка исключения в классическом C++/Java. Нет типов исключений, это скорее не recover а supres.

Как нет типа? В панику же любой параметр можно передать и потом как угодно обработать — включая проверку типа.

panic вызывает прекращение выполнение горутины в которой был выполнен. обработать можно только падение горутины.
экспешен может быть обработан на любом удобном программисту уровне.

в некоторых случаях использование паники может выступать сурагатом неправильного и примитивного использования эксепшенов.

Ну как бы не совсем так.


https://blog.golang.org/defer-panic-and-recover


Recover is a built-in function that regains control of a panicking goroutine. Recover is only useful inside deferred functions. During normal execution, a call to recover will return nil and have no other effect. If the current goroutine is panicking, a call to recover will capture the value given to panic and resume normal execution.

Т.е. если сделать recover() то потом текущая функция вернётся а рутина продолжится как ни в чём не бывало. Правильно же?

UFO just landed and posted this here

Ну для меня возможность отмены выглядит вполне как управление. Т.е. можно добиться того же что и с исключениями просто возможно не так удобно потом как это намерянно не поощеряется использовать в таком ключе.

UFO just landed and posted this here
управление выводом ошибки переместилось в run(), а вывод «Done» вообще пропал т.к. мы не знаем состояние

Всё, что у Вас пропало и переместилось, произошло не потому, что нельзя сделать как в 1-м случае, а потому что Вы так захотели. Не стоит делать выводы на таком основании. Ну а 1-й вариант на Go можете посмотреть в песочнице
try(func() {
	run()
	fmt.Print("Done")
}, func(e interface{}) {
	fmt.Print("Error")
})
отлично! лямбда вместо встроенного в язык механизма!) в ГОшку нарочно не стали включать эксепшины, чтобы люди колхозили их сами — прям как в старом-добром СИ ;)
Пример был сделан так, чтобы даже PHP-шнику стало понятно, что исключения в Go есть, а не для того, чтобы показать, как надо писать. Паники специально были засунуты в дальний угол, но не всем дано такое понять.
а не для того, чтобы показать, как надо писать
но именно это и является полезной информацией ИМХО
UFO just landed and posted this here
Вы показываете как можно «реализовать», но не говорите о том, что это непригодно для жизни.

А как Вы понимаете эти слова?
Пример был сделан так, чтобы даже PHP-шнику стало понятно, что исключения в Go есть, а не для того, чтобы показать, как надо писать. Паники специально были засунуты в дальний угол


У Вас, как минимум, получилось другое поведение — где if с проверкой типа `e`, и повторный вызов panic?

Там же, где и в Вашем примере с panic. Ведь задача была показать, что исключения есть, а не сделать один в один.
Пример был сделан так, чтобы даже PHP-шнику стало понятно

Похоже, у меня не получилось, но я хотя бы попытался. Если Вы не знаете, как сделать проверку без глобальной переменной, или считаете, что из-за многословности это не исключения, то тут уж ничего не поделать.
Вам, ведь, сразу человек написал:
можно добиться того же что и с исключениями просто возможно не так удобно
Вы ответили, что нельзя, продемонстрировав это ложным примером, а когда увидели контрпример, начали классическое повышение ставок.
UFO just landed and posted this here
мало того, panic/recover вполне себе используются даже в стандартной библиотеке в http сервере например. Типичный такой отлов необработанных исключений.
bcrypt, PDKDF2, Argon2, scrypt — это не алгоритмы шифрования.
Go стал стандартом де-факто в области создания инструментов командной строки.
Можете обосновать это?
В воспаленном воображении автора. Да и в 2020 писать о таких вещах это вообще дичь.

6 примеров налитой воды от капитана Очевидности с целью пропихнуть свои продукты.

Руководство как написать «Хайповую статью» для нового языка.

Возьми хайповый язык
возьми принципы безопасной разработки из PERL
адаптируй код
PROFIT
Все новое — это хорошо забытое старое :)
Sign up to leave a comment.