在 Golang 中,我们如何组合多个错误字符串?

68

我是golang的新手,我的应用程序需要在循环中返回多个错误,稍后需要将它们组合并作为单个错误字符串返回。我无法使用字符串函数来组合错误消息。在返回之前,有哪些方法可以用来将这些错误组合成一个单一的错误?

package main

import (
   "fmt"
   "strings"
)

func Servreturn() (err error) {

   err1 = fmt.Errorf("Something else occurred")
   err2 = fmt.Errorf("Something else occurred again")

   // concatenate both errors

   return err3

}

不足的信息。客户端是做什么的?你的服务器是做什么的?一个样本输出。 - ZAky
未来版本(Go 1.2x,预计在2023年)应该提供一种返回错误切片/树的方法。 - VonC
downvote:连接字符串消息并不那么有趣,我正在寻找一种保留错误对象的方法,而这个问题似乎与堆叠或连接错误无关。 - Ярослав Рахматуллин
Go 1.20增加了多错误包装功能。请参见此答案 - Inanc Gumus
11个回答

-1
请使用这个函数:
func JoinErrs(errs ...error) error {
    var joinErrsR func(string, int, ...error) error
    joinErrsR = func(soFar string, count int, errs ...error) error {
        if len(errs) == 0 {
            if count == 0 {
                return nil
            }
            return fmt.Errorf(soFar)
        }
        current := errs[0]
        next := errs[1:]
        if current == nil {
            return joinErrsR(soFar, count, next...)
        }
        count++
        if count == 1 {
            return joinErrsR(fmt.Sprintf("%s", current), count, next...)
        } else if count == 2 {
            return joinErrsR(fmt.Sprintf("1: %s\n2: %s", soFar, current), count, next...)
        }
        return joinErrsR(fmt.Sprintf("%s\n%d: %s", soFar, count, current), count, next...)
    }
    return joinErrsR("", 0, errs...)
}

当所有错误都为nil时,它将返回nil;当只有一个非nil错误时,它将返回相同的错误;当有多个非nil错误时,它将返回带有编号的非nil错误列表。

在此处尝试:https://play.golang.org/p/WttztCr-xHG


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接