2015-06-19 3 views
1

Я иду из Руби и смотрю на Go в данный момент. Я начинаю писать немного кода, чтобы проверить поддержку TLS для данного хоста.Управление ошибками в golang

 
var tls_versions = map[uint16]string{ 
    tls.VersionSSL30: "SSLv3", 
    tls.VersionTLS10: "TLSv1.0", 
    tls.VersionTLS11: "TLSv1.1", 
    tls.VersionTLS12: "TLSv1.2", 
} 

var refused_re = regexp.MustCompile(": connection refused") 
var nodns_re = regexp.MustCompile(": no such host") 
var versionnotsupported_re = regexp.MustCompile(": protocol version not supported") 

func checkversion(host string) (map[string]bool, error) { // {{ 
    ret := map[string]bool{} 

    for version := tls.VersionSSL30; version <= tls.VersionTLS12; version++ { 
    conn, err := tls.Dial("tcp", host+":443", &tls.Config{ 
     MinVersion: uint16(version), 
    }) 

    if err != nil && 
     (refused_re.MatchString(err.Error()) == true || nodns_re.MatchString(err.Error()) == true) { 
     log.Println(err) 
     return ret, err 
    } 

    if err != nil && versionnotsupported_re.MatchString(err.Error()) == true { 
     ret[tls_versions[uint16(version)]] = false 
     log.Println("Not supported: "+host+" "+tls_versions[uint16(version)]) 
    } 
    ret[tls_versions[uint16(version)]] = true 

    if conn != nil { 
     conn.Close() 
    } 
    } 
    return ret, nil 
} 

Исходя из Ruby, я нашел управление ошибкой в ​​этом коде довольно уродливом, как я одна опечатки/изменить от не получить правильную причину ошибки. Я пытался играть с размышлениями, но не мог заставить его делать то, что хотел. Мне было интересно, если я упустил что-то очевидное или если это был путь? Или это специфично для библиотеки crypto/tls, чтобы избежать восстановления из какой-либо проблемы?

Благодарим за помощь.

ответ

3

Существует вероятность хорошего управления ошибками в Go.

См. this answer от Dave C для приятного резюме и хороших примеров.

К сожалению, в случае пакета tls вам не повезло. Ошибки, которые вы пытаетесь обнаружить, генерируются fmt.Errorf() вызовами (которые делегируют errors.New()), поэтому они не являются особыми в какой-либо форме, и они не предварительно объявлены, поэтому вы не можете сделать значительно лучше, чем ваше текущее решение, чтобы отличить их. Вероятно, разработчики ленились предоставить более сложные или более легко прослеживаемые ошибки или просто они считали, что это не важно и упущено для простоты; поэтому они в настоящее время служат скорее информационными для разработчика.

Дальнейшее чтение (цитата из ответа Дэйва языка C):

+2

Может быть, стоит [поднимая вопрос] (HTTPS : //github.com/golang/go/blob/master/CONTRIBUTING.md) для экспорта переменных ошибки из пакета tls. – elithrar