Обработка ошибок в Go — Не традиционный подход

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Обработка ошибок — это важная часть любого языка программирования. Она помогает предотвратить незаметные сбои в приложениях, перехватывать неожиданные поведения и предоставлять осмысленные ответы, когда что-то идет не так. Однако подход Go к обработке ошибок часто приводит к написанию многословного и повторяющегося кода, что вызывает недовольство среди разработчиков. Давайте разберем, почему это происходит, какие ограничения это накладывает и какие решения могут быть предложены.

Проблема: Избыточная проверка ошибок

В Go ошибки являются значениями. Это означает, что они обрабатываются непосредственно в функции, которая их возвращает, обычно с помощью проверки на nil:

result, err := someFunction()
if err != nil {
    return err
}

Такой подход выглядит аккуратно в изоляции, но при масштабировании кодовой базы он приводит к избыточности. Множественные проверки if err != nil разбросаны по всему коду, что делает его загроможденным и сложным для поддержки.

Почему Go использует такой подход

Создатели Go выбрали подход с возвратом ошибок как значений для обеспечения простоты и явности. Проверка ошибок после каждого вызова функции гарантирует, что ошибки не останутся незамеченными. Однако с ростом проекта эта простота может превратиться в избыточность, затрудняя чтение кода.

Пример избыточности

Рассмотрим сценарий, где выполняется несколько последовательных вызовов API:

user, err := getUser(id)
if err != nil {
    return err
}

posts, err := getUserPosts(user.ID)
if err != nil {
    return err
}

comments, err := getComments(posts[0].ID)
if err != nil {
    return err
}

Каждый вызов функции сопровождается проверкой if err != nil, что делает код многословным и сложным для восприятия.

Решение: Использование функции Must

Для упрощения обработки ошибок можно создать функцию Must, которая централизованно проверяет ошибки и вызывает панику в случае их возникновения. Это позволяет избежать повторяющихся проверок.

Шаг 1: Создание функции Must

Функция Must принимает значение любого типа и ошибку. Если ошибка не равна nil, функция вызывает панику.

// utils.go
package utils

func Must[T any](value T, err error) T {
    if err != nil {
        panic(err)
    }
    return value
}

Шаг 2: Использование функции Must

Теперь можно использовать Must для упрощения вызовов функций:

package main

import (
    "fmt"
    "must_example/utils"
)

func main() {
    user := utils.Must(getUser(1))
    posts := utils.Must(getUserPosts(1))
    comments := utils.Must(getComments(1))

    fmt.Println("User:", user)
    fmt.Println("Posts:", posts)
    fmt.Println("Comments:", comments)
}

Преимущества подхода

  • Уменьшение избыточности: Проверка ошибок централизована в одной функции.

  • Улучшение читаемости: Основная логика не загромождена проверками ошибок.

  • Быстрая отладка: Паника сразу указывает на проблему.

Осторожность с Must

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

Источник: https://habr.com/ru/articles/880892/


Интересные статьи

Интересные статьи

10 лет назад мы начинали бизнес студии с разработки сайтов на CMS 1С-Битрикс. Сегодня наш основной стек связан с подходом Single Page Application на Symfony и Nuxt, но клиенты по-прежнему просят сайты...
Из бета-теста вышел обновленный виджет телефонии для Битрикс24 от платформы коммуникаций UIS. Проведем обзор его функционала. Перейти к обзору Рейтинг 0 Просмотры 1 Добавить в закладки 0
По статистике Института Гэллапа (American Institute of Public Opinion), большинство людей не любят свою работу. Около 63% не заинтересованы в работе, не имеют сильной мотивации, и, соответственно...
Мозг человека это удивительная система, способная на невероятные вещи, от сочинения «Божественной комедии» до изобретения роботов. Спектр возможностей головного мозга велик, как и спе...
Эта статья для тех, кто собирается открыть интернет-магазин, но еще рассматривает варианты и думает по какому пути пойти, заказать разработку магазина в студии, у фрилансера или выбрать облачный серви...