【愚公系列】2022年08月 Go教学课程 038-异常处理
2023-06-13 09:13:00 时间
文章目录
一、异常处理
1.什么是异常处理
异常处理,是编程语言或计算机硬件里的一种机制,用于处理软件或信息系统中出现的异常状况,异常处理的好处是你不用再绞尽脑汁去考虑各种错误,这为处理某一类错误提供了一个很有效的方法,使编程效率大大提高。
在Go语言中异常处理和其他语言有所不同通过内置的错误接口提供了非常简单的错误处理机制,比如:error、
2.error接口
任意结构体,只要实现了 Error 方法,就可以认为是 error 错误类型。
func New(text string) error {
return &errorString{text}
}
// errorString is a trivial implementation of error.
type errorString struct {
s string
}
func (e *errorString) Error() string {
return e.s
}
但我们可以用errors.New方法返回,因为errors.New方法实现了error接口的结构体实例。Go提供了两种创建error的方法:
- errors.New:可以返回错误信息
- fmt.Errorf:只是打印错误信息
下面是errors.New的使用实例
package main
import (
"fmt"
"errors"
)
func main() {
num,err := TestError(10, 0)
if err!=nil{
fmt.Println(err)
}else{
fmt.Println(num)
}
// os.Open() // ctrl+b 查看go语言自己定义好的方法的源代码。
}
func TestError(num1 int, num2 int) (result int,err error) {
err=nil
if num2 == 0 {
err=errors.New("除数不能为0")
return
}
result = num1 / num2
return
}
3.panic函数
panic是一个Go内置函数,panic的触发有两种:
- 在运行时遇到错误触发 panic
- 通过显式直接调用 panic 函数触发 panic
package main
import "fmt"
func main() {
Test(11)
}
func Test(n int) {
var num [10]int
num[n] = 12
fmt.Println("hhh")
// 程序员自己不会调用该函数,但是如果程序员自己写的程序中出现了比较严重的异常,那么系统内部会调用该函数,终止整个程序的执行。
//panic("abc") // 引发异常,从而强制终止整个程序的执行。
//fmt.Println("hello")
}
4.3.recover错误拦截
一般在程序运行时不会去捕获panic异常,直接让程序崩溃,查看panic提供的信息,修复异常。在特殊情况,我们还是需要捕获panic,比如在程序发生异常时,释放资源。
在Go语言中,recover只在defer调用的函数中有效,并且defer要在panic之前先注册,否则不能捕获异常。当panic被捕获到后,被注册的函数将获得程序控制权。
package main
import "fmt"
func main() {
Test(11)
}
func Test(n int) {
defer TestRecover()
var num [10]int
num[n] = 12
fmt.Println(num)
fmt.Println("aaaaa")
}
func TestRecover() {
fmt.Println(recover())
}
实现其他语言类似异常捕获功能如下:
func Try(fun func(), handler func(interface{})) {
defer func() {
if err := recover(); err != nil {
handler(err)
}
}()
fun()
}
func main() {
Try(func() {
panic("test panic")
}, func(err interface{}) {
fmt.Println(err)
})
// 后续代码可继续执行
fmt.Println("panic handled")
}
总结
error和panic区别:
- error是可预知的,会在代码里会进行合适的处理。
- panic是不可预知的,又程序进行自动处理异常。
相关文章
- 18.Go语言-错误与异常
- 2022-08-25:以下go语言代码输出什么?A:1 0;B:1 2;C:不能编译;D:0 0。package mainimp
- GoLang2 - Go基础语法
- 一期Go群问答-并发控制-数据竞争-错误与异常
- 2020 GO vs Python 应该选择哪一个
- Go 1.18 新增三大功能之一“工作区模式”介绍
- 一文读懂Go Http Server原理
- 「Go工具箱」redis官网推荐的go版本的分布式锁:redsync
- 「Go工具箱」go语言csrf库的使用方式和实现原理
- GO语言开篇-Go语言急速入门(基础知识点)| 青训营笔记
- Go语言学习笔记一 Golang的安装与基础
- go的数据类型-复合数据类型-struct(三)
- Go-函数-闭包
- Go-包管理-go build(一)
- Go语言多个变量同时赋值
- go fmt命令——格式化代码文件
- 使用Go语言来操作Oracle数据库(go语言oracle)
- Go语言加密通信
- 环境Go 编译 在 Linux 环境中的体验(go编译linux)
- 在 Go 中如何转储一个方法的 GOSSAFUNC 图
- MySQL中使用Go语言的好处(mysql中go什么)
- Go语言链接Oracle数据库的实践记录(go 链接oracle)
- Go语言操作Oracle数据库技术实践(go操作oracle)
- 给Oracle数据库添加专业技能,Go大发展(go_db_oracle)
- 程序Go语言调用Oracle数据库驱动程序指南(go oracle驱动)
- GO语言异常处理机制panic和recover分析