ToB企服应用市场:ToB评测及商务社交产业平台

标题: 【go语言】2.3.2 error 接口 [打印本页]

作者: 愛在花開的季節    时间: 2023-7-29 00:48
标题: 【go语言】2.3.2 error 接口
在 Go 语言中,error 是一个内置的接口类型,用于表示错误情况。error 接口的定义如下:
  1. type error interface {
  2.     Error() string
  3. }
复制代码
任何具有 Error() string 方法的类型都可以被视为实现了 error 接口。
创建自定义错误

尽管 Go 提供了 errors.New 函数用于创建简单的错误信息,但有时候,我们可能需要创建更复杂的自定义错误。这可以通过定义一个实现了 Error 方法的结构体来实现:
  1. type MyError struct {
  2.     Msg string
  3.     File string
  4.     Line int
  5. }
  6. func (e *MyError) Error() string {
  7.     return fmt.Sprintf("%s:%d: %s", e.File, e.Line, e.Msg)
  8. }
复制代码
在这个例子中,MyError 包含了一个错误消息、文件名和行号。Error 方法返回一个格式化的错误字符串。
创建 MyError 的实例:
  1. err := &MyError{
  2.     Msg: "something went wrong",
  3.     File: "main.go",
  4.     Line: 42,
  5. }
  6. fmt.Println(err)  // 输出 "main.go:42: something went wrong"
复制代码
错误的包装和解包

在处理错误时,我们有时候会遇到需要将一个错误包装到另一个错误中的情况,这可以通过 fmt.Errorf 函数和 %w 动词实现:
  1. func Foo() error {
  2.     return errors.New("foo failed")
  3. }
  4. func Bar() error {
  5.     err := Foo()
  6.     if err != nil {
  7.         return fmt.Errorf("bar failed: %w", err)
  8.     }
  9.     return nil
  10. }
  11. err := Bar()
  12. if err != nil {
  13.     fmt.Println(err)  // 输出 "bar failed: foo failed"
  14. }
复制代码
在这个例子中,Bar 函数调用了 Foo 函数,如果 Foo 函数返回了一个错误,Bar 函数会将这个错误包装到它自己的错误中。
你可以使用 errors.As 函数检查错误是否为特定的类型,或者使用 errors.Unwrap 函数获取被包装的错误。
理解并正确使用 error 接口是编写 Go 程序的关键,因为大多数函数和方法都会返回一个 error 类型的值来表示可能的错误情况。
推荐阅读:
https://mp.weixin.qq.com/s/dV2JzXfgjDdCmWRmE0glDA
https://mp.weixin.qq.com/s/an83QZOWXHqll3SGPYTL5g


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4