tgoop.com/golang_interview/297
Last Update:
📌 Предположим, ваша функция должна возвращать детализированные Recoverable и Fatal ошибки. Как это реализовано в пакете net? Как это надо делать в современном Go
В пакете net в стандартной библиотеке Go возвращение детализированных ошибок реализовано с помощью ошибок, которые являются значениями пользовательских типов, реализующих интерфейс net.Error. Этот интерфейс определен следующим образом:type Error interface {
error
Timeout() bool // возвращает true, если ошибка связана с таймаутом
Temporary() bool // возвращает true, если ошибка является временной
}
Интерфейс net.Error
включает методы Timeout() и Temporary(), которые позволяют клиентам проверять, является ли ошибка связанной с таймаутом или временной. Это позволяет клиентам принимать соответствующие действия в зависимости от типа ошибки.
В современном Go, начиная с версии 1.13, рекомендуется использовать синтаксис ошибок, основанный на типах, с помощью применения пакета errors и интерфейса fmt.Formatter
. Этот подход позволяет создавать богатые по содержанию и информативные ошибки, которые могут хранить дополнительные данные и форматироваться в нужном формате при выводе.
Вот пример, как можно реализовать детализированные ошибки в современном Go:package main
import (
"errors"
"fmt"
)
type RecoverableError struct {
Message string
}
func (e *RecoverableError) Error() string {
return fmt.Sprintf("RecoverableError: %s", e.Message)
}
type FatalError struct {
Message string
}
func (e *FatalError) Error() string {
return fmt.Sprintf("FatalError: %s", e.Message)
}
func main() {
err := doSomething()
switch {
case errors.Is(err, &RecoverableError{}):
fmt.Println("Recoverable error:", err)
case errors.Is(err, &FatalError{}):
fmt.Println("Fatal error:", err)
default:
fmt.Println("Unknown error:", err)
}
}
func doSomething() error {
// Ваша логика здесь
return &RecoverableError{Message: "Something went wrong"}
}
В этом примере у нас есть два типа ошибок: RecoverableError
и FatalError. Оба типа реализуют интерфейс error и предоставляют дополнительные данные в своих методах Error(). Функция doSomething() возвращает ошибку типа RecoverableError.
Функция main()
использует функцию errors.Is() для проверки типа ошибки и выполняет соответствующие действия в зависимости от типа ошибки.
Важно отметить, что настройка и использование детализированных ошибок может различаться в зависимости от конкретной задачи и предпочтений разработчика. Рекомендуется следовать общим рекомендациям и принципам языка Go при работе с обработкой ошибок. Например, рекомендуется использовать типы ошибок, которые являются значениями пользовательских типов и реализуют интерфейс error, чтобы их можно было легко сравнивать с помощью функции errors.Is(
), как показано в примере выше. Также рекомендуется предоставлять информативные сообщения об ошибках, чтобы облегчить отладку и понимание причины ошибки.
Всегда стоит помнить, что обработка ошибок - важная часть разработки программного обеспечения, и хорошая практика заключается в предоставлении четкой информации о возникших ошибках, чтобы помочь пользователям программы или другим разработчикам понять, что пошло не так и как это исправить.
@golang_interview
BY Golang вопросы собеседований
Share with your friend now:
tgoop.com/golang_interview/297