Go程序例子(26):异常
Go程序例子(26):异常
在 Go 语言中,通过显式的、单独的返回值来传递错误是符合惯用法的。这与 Java 和 Ruby 等语言中使用的异常机制有所不同,也与 C 语言中有时使用的单一返回值 / 错误值重载方式不同。Go 的这种做法使得我们可以轻松地识别哪些函数会返回错误,并能够使用与其他非错误任务相同的语言构造来处理这些错误。代码语言:javascript代码运行次数:0运行复制packag
Go程序例子(26):异常
在 Go 语言中,通过显式的、单独的返回值来传递错误是符合惯用法的。这与 Java 和 Ruby 等语言中使用的异常机制有所不同,也与 C 语言中有时使用的单一返回值 / 错误值重载方式不同。Go 的这种做法使得我们可以轻松地识别哪些函数会返回错误,并能够使用与其他非错误任务相同的语言构造来处理这些错误。
代码语言:javascript代码运行次数:0运行复制package main
import (
"errors"
"fmt"
)
// 按照惯例,错误是返回值中的最后一个,并且其类型为 error,这是一个内置的接口类型。
func f(arg int) (int, error) {
if arg == 42 {
// 用于构造一个包含给定错误消息的基本错误值。
return -1, ("can't work with 42")
}
// 在错误位置上的 nil 值表示没有发生错误。
return arg + , nil
}
// 哨兵错误(sentinel error)是一个预先声明的变量,用于表示特定的错误条件。
var ErrOutOfTea = fmt.Errorf("no more tea available")
var ErrPower = fmt.Errorf("can't boil water")
func makeTea(arg int) error {
if arg == 2 {
return ErrOutOfTea
} else if arg == 4 {
// 我们可以通过使用更高层次的错误来包装错误,以添加上下文。实现这一点的最简单方式是使用 fmt.Errorf 中的 %w 动词。被包装的错误会形成一个逻辑链(A 包装 B,B 包装 C,等等),可以通过像 errors.Is 和 errors.As 这样的函数来查询这些错误。
return fmt.Errorf("making tea: %w", ErrPower)
}
return nil
}
func main() {
for _, i := range []int{7, 42} {
// 在 Go 中,常见的做法是在 if 语句的条件部分直接进行错误检查。
if r, e := f(i); e != nil {
fmt.Println("f failed:", e)
} else {
fmt.Println("f worked:", r)
}
}
for i := range 5 {
if err := makeTea(i); err != nil {
// errors.Is 用于检查给定的错误(或其链中的任何错误)是否匹配特定的错误值。对于被包装或嵌套的错误,这个函数特别有用,它允许你在一系列错误中识别特定的错误类型或哨兵错误。
if errors.Is(err, ErrOutOfTea) {
fmt.Println("We should buy new tea!")
} else if errors.Is(err, ErrPower) {
fmt.Println("ow it is dark.")
} else {
fmt.Printf("unknown error: %s\n", err)
}
continue
}
fmt.Println("Tea is ready!")
}
}
运行结果:
代码语言:javascript代码运行次数:0运行复制$ go run errors.go
f worked: 10
f failed: can't work with 42
Tea is ready!
Tea is ready!
We should buy new tea!
Tea is ready!
ow it is dark.
#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
上传时间: 2025-07-27 23:31:09
上一篇:Go程序例子(27):自定义错误
下一篇:相关子查询 与非相关子查询
推荐阅读
留言与评论(共有 17 条评论) |
本站网友 视力对照表 | 21分钟前 发表 |
%s\n" | |
本站网友 东风商用车公司 | 27分钟前 发表 |
= range 5 { if err | |
本站网友 急性荨麻疹 | 0秒前 发表 |
单独的返回值来传递错误是符合惯用法的 | |
本站网友 吴清忠人体使用手册 | 19分钟前 发表 |
i | |
本站网友 上海第一百货 | 12分钟前 发表 |
if r | |
本站网友 可外链网盘 | 27分钟前 发表 |
ErrOutOfTea) { fmt.Println("We should buy new tea!") } else if errors.Is(err | |
本站网友 0x80004005 | 7分钟前 发表 |
用于表示特定的错误条件 | |
本站网友 河南大学民生学院教务网 | 30分钟前 发表 |
42} { // 在 Go 中 | |
本站网友 治疗乳腺癌 | 24分钟前 发表 |
错误是返回值中的最后一个 | |
本站网友 biliplus | 5分钟前 发表 |
实现这一点的最简单方式是使用 fmt.Errorf 中的 %w 动词 | |
本站网友 女性排卵期 | 17分钟前 发表 |
也与 C 语言中有时使用的单一返回值 / 错误值重载方式不同 | |
本站网友 驼铃声 | 29分钟前 发表 |
err) } continue } fmt.Println("Tea is ready!") } }运行结果:代码语言:javascript代码运行次数:0运行复制$ go run errors.go f worked | |
本站网友 董思阳 | 6分钟前 发表 |
i | |
本站网友 怡宝矿泉水加盟 | 23分钟前 发表 |
以添加上下文 | |
本站网友 stardict | 28分钟前 发表 |
也与 C 语言中有时使用的单一返回值 / 错误值重载方式不同 | |
本站网友 解析xml | 18分钟前 发表 |
也与 C 语言中有时使用的单一返回值 / 错误值重载方式不同 |