Добавить в корзинуПозвонить
Найти в Дзене
Merion Academy

Обработка ошибок в Go через if err != nil многим не дает покоя и энтузиасты хотят это как-то изменить

☕️ Вот что они предлагают: 1) Добавить конструкцию `check/handle` Похоже на классический try/catch. Каждую вызываемую функцию, проверяем специальным ключевым словом check. Если вернулась ошибка, то вызывается метод handle, где она уже обрабатывается. func run() error {     handle err { return err }       check one()     check two()     check three()       return nil } 2) Добавить try/catch Тут все как в предыдущем варианте, но часть с handle не обязательно вызывать там же где вызывали метод catch. Либо try просто пробросит ошибку на уровень выше. func run() (err error) { try(one()) try(two()) try(three()) return nil } 3) Добавить спецсимволы чтобы очистить синтаксис Тут все как в примере с try, но теперь это слово заменено восклицательным знаком func run() (err error) { one()! two()! three()! return nil } 4) Упростить if err != nil Тут предлагают ввести тернарные операторы, чтобы сократить до одной строки func run() error { return record.ID == "" ? errors.New("empty id") : nil

Обработка ошибок в Go через if err != nil многим не дает покоя и энтузиасты хотят это как-то изменить ☕️

Вот что они предлагают:

1) Добавить конструкцию `check/handle`

Похоже на классический try/catch. Каждую вызываемую функцию, проверяем специальным ключевым словом check. Если вернулась ошибка, то вызывается метод handle, где она уже обрабатывается.

func run() error {    

handle err { return err }   

  

check one()    

check two()    

check three()    

 

return nil

}

2) Добавить try/catch

Тут все как в предыдущем варианте, но часть с handle не обязательно вызывать там же где вызывали метод catch. Либо try просто пробросит ошибку на уровень выше.

func run() (err error) {

try(one())

try(two())

try(three())

return nil

}

3) Добавить спецсимволы чтобы очистить синтаксис

Тут все как в примере с try, но теперь это слово заменено восклицательным знаком

func run() (err error) {

one()!

two()!

three()!

return nil

}

4) Упростить if err != nil

Тут предлагают ввести тернарные операторы, чтобы сократить до одной строки

func run() error {

return record.ID == "" ? errors.New("empty id") : nil

}

Либо заменить всю конструкцию if err != nil {return err} просто знаком вопроса:

func run() (err error) {

one()?

two()?

three()?

return nil

}

И все они откланяются разработчиками языка: что-то похоже на defer, где-то появляется "магия", где-то ломается при оборачивании ошибок.

В итоге создатели языка решили прекратить рассмотрение и прием любых предложений в этой области - https://go.dev/blog/error-syntax.

Они подчеркивают, что ни одно из сотен предложений не получило даже близкого к единогласному одобрения сообщества 👀

Go существует 15 лет, и любое изменение расколет сообщество на тех, кто "за" и "против". В отличие от дженериков, новым синтаксисом для ошибок пришлось бы пользоваться всем.

Читать в VK

Читать в Мах