猿问

合并多个错误字符串

我是 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


}


交互式爱情
浏览 147回答 3
3回答

神不在的星期二

Go 1.13 更新:从Go 版本 1.13 开始,语言的错误包现在支持直接错误包装。您可以使用%w动词 in来包装错误fmt.Errorf:err := errors.New("Original error")err = fmt.Errorf("%w; Second error", err)使用Unwrap删除添加的最后一个错误,并返回剩余的内容:previousErrors := errors.Unwrap(err)错误的操场示例.Unwrap另外两个函数,errors.Is和errors.As提供了检查和检索特定类型错误的方法。error.As 和 errors.Is 的 Playground 示例Dave Cheney 的优秀errors包 ( https://github.com/pkg/errors ) 包含一个Wrap用于此目的的函数:package mainimport "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 mainimport "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)。您可以在他的博客上找到有关该软件包的更多信息:此处和此处。

冉冉说

字符串函数对错误不起作用,因为错误实际上是一个实现函数 Error() 字符串的接口。您可以在 err1.Error() 和 err2.Error() 上使用字符串函数,但不能在“err1”引用本身上使用。一些错误是结构,就像你从数据库驱动程序中得到的一样。所以没有自然的方法来对错误使用字符串函数,因为它们实际上可能不是下面的字符串。至于结合两个错误:很简单,再次使用 fmt.Errorf 即可。fmt.Errorf("Combined error: %v %v", err1, err2)或者:errors.New(err1.Error() + err2.Error())

拉莫斯之舞

你可以使用strings.Join()andappend()函数来实现这个切片。示例:golang playgorundpackage mainimport (    "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希望这可以帮助!
随时随地看视频慕课网APP

相关分类

Go
我要回答