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)。
您可以在他的博客上找到有关该软件包的更多信息:此处和此处。
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())
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
希望这可以帮助!
- 3 回答
- 0 关注
- 146 浏览
添加回答
举报