Я иду из Руби и смотрю на 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, чтобы избежать восстановления из какой-либо проблемы?
Благодарим за помощь.
Может быть, стоит [поднимая вопрос] (HTTPS : //github.com/golang/go/blob/master/CONTRIBUTING.md) для экспорта переменных ошибки из пакета tls. – elithrar