开发者学堂课程【Go 语言核心编程 - 基础语法、数组、切片、Map: Go 的自定义错误】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/625/detail/9624
Go 的自定义错误
前言
如果发生一个错误过后,在 go 程序中希望这个错误的信息由自己来定义,希望发生错误后这个程序放弃执行,因为可能有些错误是致命的,比如读取一个配置文件,如果这个配置文件都没有读取到,那下面的代码也没有意义。可以用自定义错误,完成以下的处理。
一、自定义错误的介绍
Go 程序中,也支持自定义错误,使用 errors.New 和 panic 内置函数。
1.errors.New ("错误说明""),会返回一个 error 类型的值,表示一个错误。
打开 GO 语言标准库文档找到 error,error 会返回一个错误类型。
2.panic 内置函数。接收一个 interface{} 类型的值(也就是任何值了)作为参数。可以接收 error 类型的变量,输出错误信息,并退出程序。
interface 空接口类型任何的值都可以传过去,也可以接收 error 类型的变量,panic 函数可以接收错误类型的变量,并且打印出来,而且退出程序。
3、代码案例
package main
import(
"fmt"
"time"
"errors"
)
func test() {
//使用 defer + recover 来捕获和处理异常
defer func() {
err := recover() l/ recover()
内置函数,可以捕获到异常
if err != nil
{ //说明捕获到错误
fmt.Println( "err=", err)
}
}
num1 := 10
num2 := 0
res ;= num1 / num2
fmt.Println( "res=", res)
}
//函数去读取以配置文件 init.conf 的信息
//如果文件名传入不正确,我们就返回一个自定义的错误
func readconf(name string) (err error) {
if name = "config.ini" {
//读取...
return nil
}else {
//返回一个自定义错误
return errors. New("读取文件错误..")
}
}
func test02(){
err := readconf( "config.ini")
if err != nil {
//如果读取文件发送错误,就输出这个错误,并终止程序
panic(err)
}
fmt.Println( "test02()继续执行....")
}
func main() {
//测试
//test()
//fmt.Println( "main()下面的代码...")
//time.Sleep(time.Second)
//休眠
//测试自定义错误的使用
test02()
fmt.Println( "main()下面的代码...")
}
4、运行结果:
test02() 继续执行....
main() 下面的代码...
5、代码分析:
模拟一个错误,函数去读取配置文件 init.conf 的信息,如果文件名传入不正确,就返回一个自定义的错误。func readconf(name string) (err error) ,在返回列表里面可以给一个变量名称。判断 name==“confg.init” ,读取,retrun nil 返回没有错误。如果文件名不对,返回一个自定义错误,用New创建一个自定义错误。 error 是包,需要引入 errors 包。
测试再创一个函数 test02,用 err 来接收,去调用 readConf, 如果读取文件发送错误,就输出这个错误,并终止程序。用到 panic 内置函数,会打出错误信息并终止程序。测试自定义错误的使用,直接调用 test02 ,直接输出。在代码中传输的文件名是正确,所以自定义错误不会抛出。结果输出 test02() 继续执行 ....main() 下面的代码...如果传的文件名不正确,会通过 readConf 返回自定义的错误,返回之后拿到错误,panic 会读取文件发送的错误,并输出这个错误,终止程序。结果输出 panic: 读取文件错误..,后面的代码全部不执行。这就是自定义错误的用法,输出这个错误,并终止程序。
6、结果分析:
在 main 函数中调用了 test02 ,传入的文件名不对,将会返回一个自定义的错误,panic 会向文件名发送错误,输出这个错误,并终止程序,最后输出读取文件错误。