写点什么

【愚公系列】2022 年 10 月 Go 教学课程 038- 异常处理

作者:愚公搬代码
  • 2022-10-24
    福建
  • 本文字数:1340 字

    阅读完需:约 4 分钟

一、异常处理

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 是不可预知的,又程序进行自动处理异常。

发布于: 刚刚阅读数: 3
用户头像

还未添加个人签名 2022-03-01 加入

该博客包括:.NET、Java、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、python、大数据等相关使用及进阶知识。查看博客过程中,如有任何问题,皆可随时沟通。

评论

发布
暂无评论
【愚公系列】2022年10月 Go教学课程 038-异常处理_10月月更_愚公搬代码_InfoQ写作社区