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.