Go:
Обработка ошибок

Как:

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

package main

import (
    "errors"
    "fmt"
)

func Compute(value int) (int, error) {
    if value > 100 {
        return 0, errors.New("значение должно быть 100 или меньше")
    }
    return value * 2, nil
}

func main() {
    result, err := Compute(150)
    if err != nil {
        fmt.Println("Ошибка:", err)
    } else {
        fmt.Println("Результат:", result)
    }
    
    // Изящная обработка ошибки
    anotherResult, anotherErr := Compute(50)
    if anotherErr != nil {
        fmt.Println("Ошибка:", anotherErr)
    } else {
        fmt.Println("Результат:", anotherResult)
    }
}

Пример вывода для приведенного выше кода:

Ошибка: значение должно быть 100 или меньше
Результат: 100

В этом примере функция Compute либо возвращает вычисленное значение, либо ошибку. Вызывающая сторона обрабатывает ошибку, проверяя, не равно ли err значению nil.

Глубокое погружение

Подход Go к обработке ошибок намеренно простой и типобезопасный, требующий явных проверок на ошибки. Этот концепт контрастирует с обработкой ошибок на основе исключений, видимой в языках, таких как Java и Python, где ошибки распространяются вверх по стеку вызовов, если их не перехватить обработчиком исключений. Команда Go утверждает, что явная обработка ошибок приводит к более ясному и надежному коду, так как это заставляет программистов немедленно решать проблемы с ошибками там, где они возникают.

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

Философия обработки ошибок в Go подчеркивает понимание и планирование ошибок как части нормального потока программы. Этот подход поощряет разработку более устойчивого и предсказуемого программного обеспечения, хотя и с потенциальным увеличением объема шаблонного кода. Существуют альтернативные паттерны и библиотеки для упрощения обработки ошибок в особенно сложных случаях, но встроенный в Go тип error остается основой обработки ошибок в языке.