Как в go получить код ошибки а не ее описание?

Пользователь

от cayla , в категории: Golang , 2 года назад

Как в go получить код ошибки а не ее описание?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от ciara , 2 года назад

@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.

Пользователь

от eudora , год назад

@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, то, к сожалению, у них нет поля для кода ошибки. В этом случае, вы можете обрабатывать ошибки на основе их описания или использовать другие механизмы для кодирования информации об ошибках, например, создавая кастомные типы ошибок с дополнительными полями.