Get Mystery Box with random crypto!

Try, Go, Try! English version: https://telegra.ph/Try-Go-Try- | Sea

Try, Go, Try!

English version: https://telegra.ph/Try-Go-Try-10-28

Некоторое время назад в среде Go появилось предложение о введении встроенной функции проверки ошибок try (https://go.googlesource.com/proposal/+/master/design/32437-try-builtin.md, https://habr.com/ru/post/472758/) за авторством Роберта Гризмера.

Это нужно для устранения повторяющихся проверок
if err != nil {
return nil, err
}

о которых не говорил только ленивый.

К слову, это уже не первое предложение ввести новые языковые конструкции для обработки ошибок. Уже были check и handle, о которых я уже писал (https://t.me/sea_plus_plus/77)

В новом предложении
f := try(os.Open(filename))

будет развернуто компилятором в
f, err := os.Open(filename)
if err != nil {
return nil, err
}
что весьма удобно.

handle не прижился из-за того, что был очень сильно похож на уже имеющийся механизм defer.

try будет реализован как встроенная функция. Во-первых, сделать ее обычной функцией не удастся, потому что нужно будет уметь выходить сразу из двух стек фреймов. Во-вторых, отказ от использования нового ключевого слова позволяет сохранить обратную совместимость с уже имеющимися парсерами Go.

UPD: предложение все же было закрыто.

Между прочим, C++ тоже не хватает, на мой взгляд, возможности выйти сразу из нескольких стек фреймов. Это проблему можно решить, к примеру, используя нестандартное расширение GCC и макросы: https://github.com/google/lmctfy/blob/master/util/errors.h#L229

И писать
std::string s = RETURN_IF_ERROR(FunctionReturnsStatusOrString());
получая здесь практически все то же самое, что дает try в Go.