通向Golang的捷径【13. 错误处理和测试】

Go 语言并无提供异常机制, 也就是 Java 或.NET 中出现的 try/catch 语句, 所以在 Go 语言中, 无法抛出异常, 而是使用了另一种机制, 延期-故障-恢复 (defer-panic-and-recover),Go 语言设计者认为 try/catch 机制有可能被滥用, 如果将底层异常抛向上层, 则会占用太多资源, 因此 Go 语言设计者使用另一种机制, 以使 Go 语言能捕获异常, 虽然这是一种轻量级机制, 也不能随意使用, 应将其视为最后的杀手锏.

对于一般错误,Go 语言的默认处理方式如下, 函数和方法可返回一个错误对象, 如果在执行中未出现错误, 错误对象为 nil, 因此忽略函数和方法返回的错误对象, 则可能引发应用程序的崩溃!

如果函数的执行中出现错误, 将在错误处理的过程中, 向用户发送一条错误信息, 所以程序即使存在一些问题,还是可以继续执行, 同时也提醒了用户, 但 panic-and-recover 机制通常用于异常 (无法预期的) 问题, 而不会用于一般错误的处理.

标准库程序必须返回一些错误码, 以标识函数的执行状态, 在之前的章节中, 已给出 Go 语言的常用编码方式,也就是对返回的错误码 (对象) 进行检查和报告:
• 函数可返回两个变量, 一是返回值, 其次是错误码, 如果函数执行成功, 错误码将为 nil, 否则错误码将为
非 nil 值.
• 当函数调用完成, 必须对错误码进行检查, 如果错误码不等于 nil, 应用程序的执行有可能被停止.

以下示例将检查 pack1 包函数 Func1 所返回的错误码:
在这里插入图片描述
可在一个 if 语句中, 实现错误码的赋值, 以使代码更加简明, 另外可使用 log 包的方法, 来替代 fmt.Printf(参见 13.3 节和 15.2 节), 即使出现一个故障 (panic), 也不会导致应用程序的终止.

13.1 错误处理

Go 语言中给出了一个预定义的 error 接口类型, 如下:
在这里插入图片描述
error 值可表示一种错误状态, 它的标准用法可参考 5.2 节, 其他示例可参考第 12 章的文件处理, 在第 15 章中, 给出了网络操作中 error 的用法, 在 errors 包中, 提供了一个 errorString 结构类型, 同时它实现了 error 接口, 在错误状态下, 为了终止应用程序的执行, 可使用 os.Exit(1).

13.1.1 错误定义

如果需要一种新的错误类型, 可使用 errors 包函数 errors.New, 并传入一个适合的字符串 (用于描述错误), 如下:
在这里插入图片描述

例 13.1 errors.go

在这里插入图片描述
在以下的开方函数中, 将对传入实参进行检查:
在这里插入图片描述
由于 fmt.Printf 可自动调用 String() 方法 (参见 10.7 节), 因此将输出错误信息 math - square root of negative number, 由于错误消息通常会包含一个Error: 前缀, 所以错误消息的首个字符不要使用大写字母.

在大多数情况下, 都需要创建一个自定义的错误类型 (结构), 以便在错误消息中添加一些有价值的信息, 比如当前执行的操作 (如打开文件等),url 或是完整路径名等信息, 而 String() 方法可将所有信息, 组合成一个字符串, 比如以下示例, 在 os.Open 操作中, 出现了 PathError(路径错误):
在这里插入图片描述
当出现不同的错误码时, 则需要使用一个类型断言或类型 switch 语句, 确定不同的错误码, 以处理或恢复对应的错误.
在这里插入图片描述
在这里插入图片描述
第二个代码段可在 json 包中使用, 当 JSON 文档解析中出现一个语法错误,json.Decode 函数可返回一个 SyntaxError 类型:
在这里插入图片描述
在 15.1 节中, 将会使用上述接口, 因此在所有示例中, 必须使用以下的名称转换规则, 错误类型需使用 Error后缀, 错误变量将设定为 err 或 Err.

syscall 是一个底层扩展包, 它可为操作系统的系统调用, 提供一个基本接口, 并且能返回整型错误码, syscall.Errno类型实现了 Error 接口. 大多数 syscall 函数都可返回执行结果值和错误码, 如下:
在这里插入图片描述
os 包提供了一组标准的错误变量集合, 比如 os.EINVAL, 它们已关联到 syscall 包的错误码.
在这里插入图片描述

13.1.2 创建错误对象

有时在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值