go - 如何避免在连续错误处理中重复自己

标签 go

我对连续错误有以下处理:

nodes, err := model.AllNodes()
if err != nil {                           // This error handling  
    pr := progressRes{                    // is Just a copy of
        Type:        progressResponse,    // error handling
        Message:     err.Error(),         // for the next error,
        MessageType: errorMessage,        // what is the
        Progress:    100,                 // best practice
    }                                     // to avoid
    go response(ws, pr.json())            // repeating myself here
    return                                // without making the code
}                                         // complicated
links, err := model.AllLinks()
if err != nil {
    pr := progressRes{
        Type:        progressResponse,
        Message:     err.Error(),
        MessageType: errorMessage,
        Progress:    100,
    }
    go response(ws, pr.json())
    return
}

在不使代码复杂的情况下避免在上面的代码中重复我自己的最佳做法是什么?我可以考虑添加一个新的 func,但是我只是认为可能有一个我不知道的更好的主意。

最佳答案

如果您在多个地方重复多个步骤,正确的方法是将这些步骤抽象成一个过程,这就是编程的意义所在。这适用于错误处理以及程序的任何其他部分。

一个选项:

func allNodesAndLinks() ([]*Node, []*Link, error) {
    nodes, err := model.AllNodes()
    if err != nil {
        return nil, nil, err
    }
    links, err := model.AllLinks()
    if err != nil {
        return nil, nil, err
    }
    return nodes, links, nil
}

// ...

nodes, links, err := allNodesAndLinks()
if err != nil {
    pr := progressRes{
        Type:        progressResponse,
        Message:     err.Error(),
        MessageType: errorMessage,
        Progress:    100,
    }
    go response(ws, pr.json())
    return
}

另一种选择:

func respondWithError(ws io.Writer, err error) {
    pr := progressRes{
        Type:        progressResponse,
        Message:     err.Error(),
        MessageType: errorMessage,
        Progress:    100,
    }
    response(ws, pr.json())
}

// ...

nodes, err := model.AllNodes()
if err != nil {
    go respondWithError(ws, err)
    return
}
links, err := model.AllLinks()
if err != nil {
    go respondWithError(ws, err)
    return
}

关于go - 如何避免在连续错误处理中重复自己,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50186132/

相关文章:

opencv - 在 Go 中访问原始 C 结构上的字段

来自操作系统的音频流

pointers - 确认 Go 中的结构字段非零

go - 通过反射将接口(interface)的值设置为指向 struc 类型指针的 struct 字段

转到项目结构以在单个存储库中生成具有相同名称的库和 cli

dictionary - 返回结构映射的包

转到 : channel is necessary in this case?

performance - Go按位运算性能之谜

go - 使用 kubernetes go 客户端扩展部署副本

具有多个嵌入结构的 Go MarshalJSON 行为