您现在的位置是:首页 > 编程 > 

Go程序例子(26):异常

2025-07-28 02:24:13
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组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1253597.html

相关标签:无
上传时间: 2025-07-27 23:31:09
留言与评论(共有 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 语言中有时使用的单一返回值 / 错误值重载方式不同