为了账号安全,请及时绑定邮箱和手机立即绑定

合并多个错误字符串

合并多个错误字符串

Go
交互式爱情 2021-11-22 10:36:21
我是 golang 新手,我的应用程序需要在循环中返回多个错误,稍后需要组合并作为单个错误字符串返回。我无法使用字符串函数来组合错误消息。在返回之前,可以使用哪些方法将这些错误合并为一个错误?package mainimport (   "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}
查看完整描述

3 回答

?
神不在的星期二

TA贡献1963条经验 获得超6个赞

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 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)。


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


查看完整回答
反对 回复 2021-11-22
?
冉冉说

TA贡献1877条经验 获得超1个赞

字符串函数对错误不起作用,因为错误实际上是一个实现函数 Error() 字符串的接口。

您可以在 err1.Error() 和 err2.Error() 上使用字符串函数,但不能在“err1”引用本身上使用。

一些错误是结构,就像你从数据库驱动程序中得到的一样。

所以没有自然的方法来对错误使用字符串函数,因为它们实际上可能不是下面的字符串。

至于结合两个错误:

很简单,再次使用 fmt.Errorf 即可。

fmt.Errorf("Combined error: %v %v", err1, err2)

或者:

errors.New(err1.Error() + err2.Error())


查看完整回答
反对 回复 2021-11-22
?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

你可以使用strings.Join()andappend()函数来实现这个切片。


示例: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

希望这可以帮助!


查看完整回答
反对 回复 2021-11-22
  • 3 回答
  • 0 关注
  • 146 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信