You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

errors.Is()无法正常捕获AllTopologyNodesDownError错误问题排查

问题根因

你用errors.Is做错误类型匹配属于API使用错误,这是捕获逻辑不生效的核心原因。
errors.Is的作用是检查错误链中是否存在值完全相等的目标错误实例,你代码中传入的&ravendb.AllTopologyNodesDownError{}是全新创建的空结构体指针,和getClusterTopology实际返回的错误实例不是同一个内存地址,值也不可能完全匹配,所以判断逻辑永远返回false。

正确实现方案

你需要判断错误的类型是否为AllTopologyNodesDownError,应该使用errors.As API,修改后的代码如下:

func (sc *ServerConfig) addNodesToCluster(store *ravendb.DocumentStore) error {
        clusterTopology, err := sc.getClusterTopology(store)
        var targetErr *ravendb.AllTopologyNodesDownError
        if errors.As(err, &targetErr) {
            for _, url := range sc.Url.List {
                    err = addNodeToCluster(store, url)
                    if err != nil {
                        return err
                    }
            }
        } else if err != nil {
            return err
        }
        // 原有后续逻辑
}

补充注意点

  • 如果AllTopologyNodesDownError在ravendb包中是作为值类型而非指针类型返回的,只需要调整targetErr的声明即可:
    var targetErr ravendb.AllTopologyNodesDownError
    if errors.As(err, &targetErr) {
        // 处理逻辑
    }
    
  • 要保证你导入的ravendb包版本和定义错误的版本完全一致,不同版本的包定义的同名称类型在Go中会被判定为不同类型,也会导致匹配失败。

内容的提问来源于stack exchange,提问作者OmerMichleviz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 05:18:00