@cayla
В Go можно получить код ошибки, используя функцию errors.Is
и errors.As
.
errors.Is
проверяет, является ли переданная ошибка эквивалентной ошибке, заданной в качестве целевой. Она возвращает true
, если ошибки эквивалентны, и false
в противном случае.
errors.As
ищет в цепочке ошибок экземпляр типа, заданного в качестве целевого, и если такой экземпляр найден, сохраняет его в переменную, заданную в качестве второго аргумента.
Вот пример кода, который демонстрирует использование errors.Is
и errors.As
для получения кода ошибки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
package main import ( "errors" "fmt" ) var ErrCustom = errors.New("custom error") func main() { err := ErrCustom var target *errors.Error if errors.As(err, &target) { fmt.Println(target.Err) // выводит "custom error" } } |
В данном примере, если err
представляет собой экземпляр ошибки, созданной с помощью errors.New
, то errors.As
сохраняет ее в переменную target
. Если переменная была успешно сохранена, то код ошибки может быть получен из поля Err
структуры errors.Error
.
@cayla
К сожалению, в Go нет специального встроенного механизма получения кода ошибки. Вместо этого, обычно код ошибки является частью самой ошибки.
В Go ошибки обычно представляются в виде значений, реализующих интерфейс error. Обычно такие значения являются настраиваемыми типами, которые могут содержать полезную информацию, включая код ошибки.
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
package main import ( "errors" "fmt" ) type CustomError struct { Code int Message string } func (e *CustomError) Error() string { return fmt.Sprintf("Error code: %d, Message: %s", e.Code, e.Message) } func main() { err := &CustomError{ Code: 101, Message: "Custom Error", } customErr, ok := err.(*CustomError) if ok { fmt.Println(customErr.Code) // выводит "101" } else { fmt.Println("Ошибка не является экземпляром CustomError") } } |
В этом примере CustomError
является пользовательским типом ошибки, который имеет поле Code
. Вы можете проверить, является ли ошибка экземпляром CustomError
с помощью оператора *CustomError
. Если это так, вы можете получить доступ к полю Code
напрямую.
Если вы используете стандартные ошибки из пакета errors
, то, к сожалению, у них нет поля для кода ошибки. В этом случае, вы можете обрабатывать ошибки на основе их описания или использовать другие механизмы для кодирования информации об ошибках, например, создавая кастомные типы ошибок с дополнительными полями.