当前位置: 首页 > 知识库问答 >
问题:

在golang中管理错误

焦阎宝
2023-03-14

我从Ruby来,现在正在看围棋。我开始编写一些代码来检查对给定主机的TLS支持。

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
} 

共有1个答案

谷梁子昂
2023-03-14

在GO中有可能进行良好的错误管理。

请参阅Dave C的这个答案,以获得一个很好的总结和很好的例子。

不幸的是,对于TLS包,您就不走运了。您试图检测的错误是由fmt.errorf()调用(这些调用委托给errors.new())生成的,因此它们在任何方面都不是特殊的,也不是预先声明的,因此在区分它们方面,您不能比当前的解决方案做得更好。可能是开发人员懒得提供更复杂或更容易跟踪的错误,或者只是他们认为这并不重要,为了简单而忽略了这一点;因此,它们目前更像是为开发人员提供信息。

进一步阅读(引自戴夫C的回答):

  • 有效继续错误
  • Go博客错误处理和Go
  • 戴夫·切尼检查错误
 类似资料:
  • 如果问题模棱两可,请道歉。

  • 问题内容: 创建用于通过API获取数据的数据库管理器API的基本概念。我正在使用GORM来获取strcut实例的数据。因此,代表表的结构为300-400。 下一步,我实现了一个函数,该函数通过表名(通过API端点参数获取的内容)返回结构的正确实例。 之后是一个操作结构,其中唯一的一个字段是DB。有一些方法,例如我要使用GORM db.Last(&users)函数的GetLast()。 有几点,所以

  • 我正试图让所有表都显示在Adminer中,这样我就不必远程访问Windows服务器来查看表并从我正在使用的MS SQL DB进行查询。当我点击“选择表名”查看任何表上的数据时,我遇到了这个错误。你认为我需要做什么来解决这个问题? ! ) 警告:mssql_query():消息:无法使用DB Library(如ISQL)或ODBC 3.7版或更早版本将仅Unicode排序规则或ntext数据中的Un

  • 问题内容: 在Golang中,我们可以将GitHub上的开源库指定为依赖项。例如: 如果我理解正确,这将尝试根据您的Go版本查找分支,默认为master。 因此,无法导入依赖的特定版本,例如: 那么,在Go中管理依赖项的最佳实践是什么? 我可以看到两种方法。 I.版本模块 是否为具有重大变更的主要版本创建新模块? 例如,我的Go库可以定义模块v1和v2,因此您可以执行以下操作: 要么: 根据您的需

  • 我正在使用Spring Batch Admin从我的主项目的批处理模块中启动批处理。 在Spring batch Admin项目的依赖项中,将批处理模块编译为JAR addedstrong文本,如下所示: 因为我在一个reader类上添加了“@stepscope”,所以在部署Spring Batch Admin时,我会遇到以下错误 但是我没有找到如何使用类似的声明来防止Spring Batch A

  • 上述实现并发的代码中为了保持主线程不挂掉,我们都会在最后写上一个死循环或者写上一个定时器来实现等待 goroutine 执行完毕 上述实现并发的代码中为了解决生产者消费者资源同步问题,我们利用加锁来解决,但是这仅仅是一对一的情况,如果是一对多或者多对多,上述代码还是会出现问题 综上所述,企业开发中需要一种更牛 X 的技术来解决上述问题,那就是管道(Channel) Channel 的本质是一个队列