База Hintsage

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

Errors, wrapping, panic/recover и проектирование ошибок.

Практика

Вопросы: Обработка ошибок

Разберите результат: почему errors.Is не считает два значения с одинаковым содержимым одной ошибкой?

package main

import (
	"errors"
	"fmt"
)

type ValidationErrors []string

func (e ValidationErrors) Error() string { return fmt.Sprint([]string(e)) }

func main() {
	a := ValidationErrors{"email"}
	b := ValidationErrors{"email"}
	fmt.Println(errors.Is(a, b))
}
Программирование GoОбработка ошибокGo-разработчик серверных приложений

В цепочке обёрток две ошибки одного типа. Какую ошибку получит errors.As?

package main

import (
	"errors"
	"fmt"
)

type tagged struct { name string; cause error }
func (e *tagged) Error() string { return e.name }
func (e *tagged) Unwrap() error { return e.cause }

func main() {
	inner := &tagged{name: "inner"}
	outer := &tagged{name: "outer", cause: inner}
	var got *tagged
	errors.As(outer, &got)
	fmt.Println(got.name)
}
Программирование GoОбработка ошибокРазработчик Go среднего уровня

Представьте обработчик, который ищет конкретный тип ошибки. Какой контракт аргумента target нарушен в этом фрагменте и какое последствие возникнет?

package main

import (
	"errors"
	"fmt"
)

type quotaError struct{}
func (*quotaError) Error() string { return "quota exceeded" }

func main() {
	var target *quotaError
	fmt.Println(errors.As(&quotaError{}, target))
}
Программирование GoОбработка ошибокGo-разработчик серверных приложений

Показано 21–40 из 50

Восстановление доступа