Go语言之Go语言 异常处理与测试

Go 语言异常处理与测试

Go 语言异常处理

Go语言没有结构化异常,使用 panic 抛出错误,recover 捕获错误。

异常的使用场景简单描述:Go中可以抛出一个panic的异常,然后在defer中通过recover捕获这个异常,然后正常处理。

panic:

1、内置函数

2、假如函数F中书写了panic语句,会终止其后要执行的代码,在panic所在函数F内如果存在要执行的defer函数列表,按照defer的逆序执行

3、返回函数F的调用者G,在G中,调用函数F语句之后的代码不会执行,假如函数G中存在要执行的defer函数列表,按照defer的逆序执行

4、直到goroutine整个退出,并报告错误

recover:

1、内置函数

2、用来控制一个goroutine的panicking行为,捕获panic,从而影响应用的行为

3、一般的调用建议

a). 在defer函数中,通过recever来终止一个goroutine的panicking过程,从而恢复正常代码的执行

b). 可以获取通过panic传递的error

注意:

1、利用recover处理panic指令,defer 必须放在 panic 之前定义,另外 recover 只有在 defer 调用的函数中才有效。否则当panic时,recover无法捕获到panic,无法防止panic扩散。

2、recover 处理异常后,逻辑并不会恢复到 panic 那个点去,函数跑到 defer 之后的那个点。

3、多个 defer 会形成 defer 栈,后定义的 defer 语句会被最先调用。

异常处理

一、panic、recover 参数类型为 interface{},因此可抛出任何类型对象。

func panic(v interface{})
func recover() interface{}
package main

import (
    "fmt"
)

func main() {
    defer func() {
        if err := recover(); err != nil {
            fmt.Println(err)
        }
    }()
    panic("panic error!")
}

二、延迟调用中引发的错误,可被后续延迟调用捕获,但仅最后一个错误可被捕获。

package main

import "fmt"

func main() {
    defer func() {
        fmt.Println(recover())
    }()

    defer func() {
        panic("defer panic")
    }()

    panic("panic error")
}

运行结果:

defer panic

三、捕获函数 recover 只有在延迟调用内直接调用才会终止错误,否则总是返回 nil。任何未捕获的错误都会沿调用堆栈向外传递。

Go 错误处理

Go 语言通过内置的错误接口提供了非常简单的错误处理机制。

error类型是一个接口类型,这是它的定义:

type error interface {
    Error() string
}

们可以在编码中通过实现 error 接口类型来生成错误信息。

函数通常在最后的返回值中返回错误信息。使用errors.New 可返回一个错误信息:

func Sqrt(f float64) (float64, error) {
    if f < 0 {
        return 0, errors.New("math: square root of negative number")
    }
    // 实现
}

在下面的例子中,我们在调用Sqrt的时候传递的一个负数,然后就得到了non-nil的error对象,将此对象与nil比较,结果为true,所以fmt.Println(fmt包在处理error时会调用Error方法)被调用,以输出错误,请看下面调用的示例代码:

result, err:= Sqrt(-1)

if err != nil {
   fmt.Println(err)
}

原文地址:https://www.cnblogs.com/heych/p/12579588.html

时间: 2024-08-30 07:53:47

Go语言之Go语言 异常处理与测试的相关文章

【Go语言】错误与异常处理机制

①error接口 Go语言中的error类型实际上是抽象了Error()方法的error接口 type error interface { Error() string } Go语言使用该接口进行标准的错误处理. 对于大多数函数,如果要返回错误,大致上都可以定义为如下模式,将error作为多种返回值中的最后一个,但这并非是强制要求: func Foo(param int)(n int, err error) { // ... } 调用时的代码建议按如下方式处理错误情况: n, err := Fo

24_Shell语言————if条件判断之字符测试

前文中介绍过,bash的条件测试主要有以下3类: 整数测试:比较两个整数谁大谁小,是否相等: 字符测试:比较两个字符串是否相等: 文件测试:测试某个文件是否具有读权限.写权限.执行权限等: 整数测试在前文中介绍过,这里着重讲解字符测试.字符测试采用的比较符号是常用的数学符号: >:大于(在ASCII码表中的先后顺序,从左至右逐字比较) <:小于 ==:等于(注意,= 表示赋值) =~:判断左边的字符串是否能够被右边的模式所匹配,通常用于双中括号中: [[ $opt1=~$opt2 ]] 通常做

26_Shell语言————if条件判断之文件测试、短路操作符

一.文件测试 文件测试大多都是单目测试,其用法相对简单,其格式为: 操作符:文件路径 可以用来测试的选项有: -f:测试其是否为普通文件,即使用ls -l命令查看时,文件类型显示为 - 的文件: -d:测试其是否为目录文件,即使用ls -l命令查看时,文件类型显示为 d的文件: -e:测试文件是否存在,不论是目录还是文件,如果存在则为真,否则为假: -r:测试文件对当前访问者来说(非创建者)是否可读: -w:测试文件对当前访问者来说(非创建者)是否可写: -x:测试文件对当前访问者来说(非创建者

初识GO语言——安装Go语言

本文包括:1)安装Go语言.2)运行第一个Go语言.3)增加vim中对Go语言的高亮支持. 1.安装Go语言 本文采用源码安装Go语言,Go语言的源代码在百度网盘 http://pan.baidu.com/s/1mguZqhM 1.1.修改环境变量 编辑文件~/.bashrc vim ~/.bashre 在文件最后添加如下代码 # about go language export GOROOT=$HOME/go export GOARCH=386 export GOOS=linux export

LoadRunner脚本语言之C语言

LoadRunner脚本语言之C语言 Loadrunner几乎支持所有主流语言,比如C语言,JAVA,VB等.Web(HTTP/HTML)协议默认使用的是C语言. Loadrunner 脚本语言架构 Loadrunner的脚本主要由Action组成.Action包含3个独立的函数:vuser_init().action().vuser_end().我们通常把用户操作根据类型存放在不同的函数中. 函数 函数描述 Vuser_init() 一般将用户初始化的操作放在这里,例如登陆.分配内存 Acti

6、Struts2中的国际化、Ognl(对象图导航语言)表达式语言

Struts2中的国际化.Ognl(对象图导航语言)表达式语言 回顾:Servlet 中国际化: 1). 写资源文件 基础名.properties [默认的语言环境的配置] 基础名语言简称国家简称.properties 2). 读取资源文件,再使用 程序:ResourceBundle Jsp: jstl提供的格式化与国际化标签库. 一.Struts2中国际化: 1. 写资源文件 (同servlet) 2. 读资源文件 程序:ResourceBundle (同servlet) JSP: 1)jst

Swift语言指南(一)--语言基础之常量和变量

Swift 是开发 iOS 及 OS X 应用的一门新编程语言,然而,它的开发体验与 C 或 Objective-C 有很多相似之处. Swift 提供了 C 与 Objective-C 中的所有基础类型,包括表示整数的 Int,表示浮点数的 Double 与 Float,表示布尔值的 Bool,以及表示纯文本数据的 String. Swift 还为两个基本集合类型 Array 与 Dictionary 提供了强大的支持,详情可参考 (集合类型)Collection Types. 与 C 语言类

0基础学C语言:C语言视频教程免费分享!

C语言是一种通用的.过程式的编程语言,广泛用于系统与应用软件的开发.作为计算机编程的基础语言,长期以来它一直是编程爱好者追捧而又比较难学的语言.C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点. 很多初学者在学习C语言的时候,如果有适合自己的视频教程,学习起来就会事半功倍.今天在这里给大家分享一个0基础学习C语言的视频教程,需要的朋友可以看看,作为参考! 课程部分截图: 百度云盘下载:http://pan.baidu.com/s/1jIbtWEi 密码:npd9

编译性语言、解释性语言和脚本语言

1.计算机不能直接理解高级语言,只能理解机器语言,所以必须要把高级语言翻译成机器语言,计算机才能执行高级语言编写的程序.(计算机只能执行机器语言:我们要执行高级语言编的代码,就只能用编译器把它变成机器语言) 2.翻译有两种方式:a.编译b.解释.两种方式主要是翻译的时间不同 3.编译语言:编译型语言写的程序执行之前,需要一个专门的编译过程,把程序编译成机器语言文件:比如,exe文件,以后运行的话就不用重新编译了,直接使用编译的结果就行了:因为翻译只做了一次,运行时不需要翻译,所以编译型语言的程序