Golang:error包错误处理

简介: Golang:error包错误处理

目录

1、Golang error包

内建error接口

// builtin.go
type error interface {
    Error() string
}

实现error接口

// errors.go
package errors
type errorString struct {
    s string
}
func (e *errorString) Error() string {
    return e.s
}

2、创建 error

定义

// package errors
func New(text string) error {}
// package fmt
func Errorf(format string, a ...any) error {}

代码示例

package main
import (
    "errors"
    "fmt"
)
func main() {
    // 方式一:通过字符串构建 error
    err := errors.New("error")
    fmt.Printf("err: %v\n", err)
    // err: error
    // 方式二:格式化输出错误字符串
    fmtErr := fmt.Errorf("this is a error: %s", "fmt error")
    fmt.Printf("fmtErr: %v\n", fmtErr)
    // fmtErr: this is a error: fmt error
}

3、错误处理

3.1、抛出错误和处理错误

package main
import (
    "errors"
    "fmt"
)
// 自定义错误
var DBError = errors.New("DBError")
func getRecords() (any, error) {
    // 抛出错误
    return nil, DBError
}
func main() {
    // 错误处理
    _, err := getRecords()
    if err != nil {
        fmt.Printf("err: %v\n", err)
    } else {
        fmt.Printf("not err")
    }
    // err: DBError
}

3.2、errors.Is

package main
import (
    "errors"
    "fmt"
)
// 自定义错误
var DBError = errors.New("DBError")
// 错误包裹
var NotFoundError = fmt.Errorf("%w", DBError)
func getRecords() (any, error) {
    return nil, NotFoundError
}
func main() {
    // 错误处理
    _, err := getRecords()
    if err != nil {
        if errors.Is(err, DBError) {
            fmt.Println("err Is DBError")
        }
        if errors.Is(err, NotFoundError) {
            fmt.Println("err Is NotFoundError")
        }
    } else {
        fmt.Printf("not err")
    }
    // err Is DBError
    // err Is NotFoundError
}

3.3、errors.As

package main
import (
    "errors"
    "fmt"
)
// 自定义错误
type DBError struct {
    desc string
}
func (dbError DBError) Error() string {
    return dbError.desc
}
func getRecords() (any, error) {
    return nil, DBError{
        desc: "DBError",
    }
}
func main() {
    // 错误处理
    _, err := getRecords()
    if err != nil {
        var dbError DBError
        if errors.Is(err, dbError) {
            fmt.Println("err Is DBError")
        }
        if errors.As(err, &dbError) {
            fmt.Println("err As NotFoundError")
        }
    } else {
        fmt.Printf("not err")
    }
    // err As NotFoundError
}

参考

Go 语言入门很简单:Go 语言的错误处理


相关文章
|
3月前
|
Go
Golang语言错误处理机制
这篇文章是关于Golang语言错误处理机制的教程,介绍了使用defer结合recover捕获错误、基于errors.New自定义错误以及使用panic抛出自定义错误的方法。
55 3
|
3月前
|
Go
Golang的math包常用方法
这篇文章介绍了Golang的math包中的常量和常用方法,并通过示例代码展示了如何使用这些常量和方法。
186 87
Golang的math包常用方法
|
3月前
|
存储 Go
Golang语言基于go module方式管理包(package)
这篇文章详细介绍了Golang语言中基于go module方式管理包(package)的方法,包括Go Modules的发展历史、go module的介绍、常用命令和操作步骤,并通过代码示例展示了如何初始化项目、引入第三方包、组织代码结构以及运行测试。
70 3
|
3月前
|
Go
Golang语言基于GOPATH方式管理包(package)
这篇文章详细介绍了Golang语言中基于GOPATH方式管理包(package)的方法,包括包的概述、定义、引入格式、别名使用、匿名引入,以及如何快速入门自定义包,并通过具体代码案例展示了包的环境准备、代码编写、细节说明和程序运行。
46 3
|
3月前
|
Go
Golang语言之包依赖管理
这篇文章详细介绍了Go语言的包依赖管理工具,包括godep和go module的使用,以及如何在项目中使用go module进行依赖管理,还探讨了如何导入本地包和第三方库下载的软件包存放位置。
46 3
|
4月前
|
机器学习/深度学习 存储 人工智能
Golang bytes 包学习
Golang bytes 包学习
32 3
|
4月前
|
Go 开发者
|
4月前
|
存储 测试技术 Go
Golang 包:构建模块化代码的基石
【8月更文挑战第31天】
52 0
|
5月前
|
中间件 测试技术 Go
Golang中的错误处理最佳实践
【7月更文挑战第10天】在Golang中,错误处理是核心且重要的。最佳实践包括:定义明确的错误类型,使用错误链(如`%w`包装错误),始终检查错误(避免忽略),谨慎使用`panic`和`recover`,利用多值返回处理错误,标准化错误处理逻辑,并确保测试错误处理代码。这些做法有助于构建健壮和可维护的程序。
|
7月前
|
XML JSON Go
Golang深入浅出之-XML处理在Go语言中的实现:encoding/xml包
【4月更文挑战第26天】Go语言的`encoding/xml`库提供XML处理,包括序列化和反序列化。本文讨论了XML处理的基础,如`xml.Marshal`和`xml.Unmarshal`函数,以及常见问题和易错点,如标签命名、结构体嵌套、omitempty标签和命名空间。建议遵循标签命名规则,正确处理嵌套和属性,谨慎使用omitempty,以及理解并有效利用命名空间。文中还给出了基础示例和处理XML属性的代码示例,帮助读者掌握XML处理技巧。
141 1
Golang深入浅出之-XML处理在Go语言中的实现:encoding/xml包