You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Go语言中如何避免连续错误处理的代码重复?

最佳实践:提取重复错误逻辑为辅助函数

嘿,这个场景太常见了!你现在的重复错误处理代码完全可以通过抽离成辅助函数来解决,而且完全不会增加复杂度,反而让代码更清晰易维护。

具体怎么做?

首先,把那段重复的错误处理逻辑单独拎出来,做成一个小函数——它的职责很单一:接收错误和WebSocket连接,构造响应并异步发送。

方案1:包级辅助函数(如果WebSocket类型在包内可见)

// 定义在当前包的合适位置
func sendErrorResponse(ws WebSocketConn, err error) {
    pr := progressRes{
        Type:        progressResponse,
        Message:     err.Error(),
        MessageType: errorMessage,
        Progress:    100,
    }
    go response(ws, pr.json())
}

然后你的业务代码就可以简化成这样:

nodes, err := model.AllNodes()
if err != nil {
    sendErrorResponse(ws, err)
    return
}

links, err := model.AllLinks()
if err != nil {
    sendErrorResponse(ws, err)
    return
}

方案2:内部辅助函数(Go 1.21+推荐,更紧凑)

如果这段错误处理只在当前函数里用到,你可以直接在函数内部定义一个小函数,它能捕获外部的ws变量,不需要额外传参:

func yourBusinessFunction(ws WebSocketConn) {
    // 内部定义错误处理函数,直接捕获外层的ws
    sendError := func(err error) {
        pr := progressRes{
            Type:        progressResponse,
            Message:     err.Error(),
            MessageType: errorMessage,
            Progress:    100,
        }
        go response(ws, pr.json())
    }

    nodes, err := model.AllNodes()
    if err != nil {
        sendError(err)
        return
    }

    links, err := model.AllLinks()
    if err != nil {
        sendError(err)
        return
    }

    // 后续业务逻辑...
}

为什么这是最佳实践?

  • 完全符合DRY原则:彻底消除重复代码,以后要修改错误响应的格式(比如调整Progress值或者MessageType),只需要改这一个函数就行,不用到处找重复代码修改。
  • 零额外复杂度:函数职责单一,就是处理错误并发送响应,读代码的人一眼就能懂。
  • 扩展性强:如果以后需要给错误响应加更多字段(比如错误码),只需要在辅助函数里调整,所有调用处自动生效。

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

火山引擎 最新活动