组合多个错误字符串

新手上路,请多包涵

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

 package main

import (
   "fmt"
   "strings"
)

func Servreturn() (err error) {

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

   // concatenate both the error

   return err3

}

原文由 Greg Petr 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 574
2 个回答

您可以使用 strings.Join()append() 函数来实现此切片。

示例:golang playgorund

 package main

import (
    "fmt"
    "strings"
    "syscall"
)

func main() {

    // create a slice for the errors
    var errstrings []string

    // first error
    err1 := fmt.Errorf("First error:server error")
    errstrings = append(errstrings, err1.Error())

    // do something
    err2 := fmt.Errorf("Second error:%s", syscall.ENOPKG.Error())
    errstrings = append(errstrings, err2.Error())

    // do something else
    err3 := fmt.Errorf("Third error:%s", syscall.ENOTCONN.Error())
    errstrings = append(errstrings, err3.Error())

    // combine and print all the error
    fmt.Println(fmt.Errorf(strings.Join(errstrings, "\n")))

}

这将输出一个字符串,您可以将其发送回客户端。

 First error:server1
Second error:Package not installed
Third error:Socket is not connected

希望这可以帮助!

原文由 askb 发布,翻译遵循 CC BY-SA 3.0 许可协议

更新 1.13:

Go 版本 1.13 开始,该语言的 错误包 现在直接支持 错误包装

您可以通过在 --- 中使用 fmt.Errorf %w 动词来包装错误:

 err := errors.New("Original error")
err = fmt.Errorf("%w; Second error", err)

使用 Unwrap 删除最后添加的错误,并返回剩余的内容: previousErrors := errors.Unwrap(err)

errors.Unwrap 的游乐场示例

另外两个函数 errors.Iserrors.As 提供了检查和检索特定类型错误的方法。

errors.As 和 errors.Is 的游乐场示例


Dave Cheney 的优秀 errors 包 ( https://github.com/pkg/errors ) 包括一个 Wrap 用于此目的的函数:

 package main

import "fmt"
import "github.com/pkg/errors"

func main() {
        err := errors.New("error")
        err = errors.Wrap(err, "open failed")
        err = errors.Wrap(err, "read config failed")

        fmt.Println(err) // "read config failed: open failed: error"
}

这也允许额外的功能,例如解包错误原因:

 package main

import "fmt"
import "github.com/pkg/errors"

func main() {
    err := errors.New("original error")
    err = errors.Wrap(err, "now this")

    fmt.Println(errors.Cause(err)) // "original error"
}

以及在指定 fmt.Printf("%+v\n", err) 时输出堆栈跟踪的选项。

您可以在他的博客上找到有关该软件包的更多信息: 此处此处

原文由 Feckmore 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题