Я учусь и пытаюсь понять, как получить более подробную информацию об ошибках из общего типа ошибки. Пример, который я буду использовать, - это сетевой пакет, в частности функция DialTimeout.
Подпись
func DialTimeout(network, address string, timeout time.Duration) (Conn, error)
Тип error определяет только функцию Error() string
. Если я хочу выяснить, почему DialTimeout не удалось, как я могу получить эту информацию? Я узнал, что могу использовать утверждение типа для получения конкретной ошибки net.Error
:
con, err := net.DialTimeout("tcp", net.JoinHostPort(address, "22"),
time.Duration(5) * time.Second)
if err != nil {
netErr, ok := err.(net.Error)
if ok && netErr.Timeout() {
// ...
}
}
но это только говорит мне, был ли у меня тайм-аут. Например, скажем, я хотел различать отказанное соединение и никакой маршрут к хосту. Как я могу это сделать?
Возможно, DialTimeout слишком высокоуровневый, чтобы дать мне такую деталь, но даже глядя на syscall.Connect, я не вижу как получить конкретную ошибку. Он просто говорит, что возвращает общий тип ошибки. Сравните это с Posix connect, который сообщит мне, почему он не прошел с различными кодами возврата.
Мой общий вопрос: как я должен вытащить данные об ошибке из общего типа error
, если документы golang не говорят мне, какие ошибки могут быть возвращены?