GO 错误处理机制 | 学习笔记

简介: 快速学习 GO 错误处理机制

开发者学堂课程【Go 语言核心编程 - 基础语法、数组、切片、Map: GO 错误处理机制】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/625/detail/9621


GO 错误处理机制

基本内容

一、 前景引入

二、 基本说明

三、 使用 defer+recover 来处理错误

四、 错误处理的好处

 

一、前景引入

1、先看一段代码,看看输出什么?代码如下:(错误处理)

package main

import (

"fmt"

)

func test() {

num1 := 10

num2 :=0

res := num1 / num2

fmt.Println( "res=", res)

}

func main() {

//测试 test()

fmt.Println( "main()下面的代码和逻辑")

}

引出 golang 的错误处理机制

2、主函数“func main() {” 里面调用了 test。test 中有 num1,num2。用 num1 除以 num2,但是 num2 是 0,但是在除法中分母不能为 0,所以会报错。

问:在 golang 中出现了错误会怎么处理?

答:新建一个文件夹“error”,创建一个新的文件“main.go”。如果调用 test(),再输出 fmt.Println( "main() 下面的代码和逻辑"),看在 go 中出现错误是否能执行到这段代码,运行后发现不能执行到这段代码。从进入到 test 中后,在 res := num1 / num2 报错了,错误的原因是除以 0。现在希望即使代码出错了,仍能将代码继续往下执行,第二即使出错了,给一个预警的机制,在 golang 中也有错误处理机制,它的错误处理机制应用起来能够让代码效率更高。上面程序报错了,下面的代码仍能继续执行。第二检测到了错误,能发一个邮件给管理员告知服务器有代码错误。所以通过这个案例引出了错误管理机制。

3、对上面代码的总结

(1) 在默认情况下,当发生错误后 (panic)  ,程序就会退出(崩溃.)

(2) 当发生错误后,可以捕获到错误,并进行处理,保证程序可以继续执行。还可以在捕获到错误后,给管理员一个提示(邮件、短信等等)

(3) 这里引出错误处理机制。


二、基本说明

1、 Go 语言追求简洁优雅。所以Go语言不支持传统的 try… catch…finally 这种处理。

JAVA 的错误处理是 try…catch…finally 这种处理,但在 Go 语言中并不用这种,很容易造成程序的混乱。

2、 Go 中引入的处理方式为: defer,panic, recover

3、 这几个异常的使用场景可以这么简单描述:当发生错误的时候 Go 中可以抛出一个 panic 的异常,然后在 defer 中通过 recover 捕获这个异常,然后正常处理。往往这三种是结合使用。

 

三、 使用 defer+recover 来处理错误

1、准确的说异常会在 test 中发生,使用 defer + recover 来捕获和处理异常, defer 后面调用一个匿名函数,函数中 recover() 内置函数,可以捕获到异常,判断有没有错误 if err != nil,如果不等于 nil 说明有错误,说明捕获到错误。再把错误异常进行打印,匿名函数的调用括起来就可以,处理完后下面的代码可以继续执行。如果是一个循环,它会不停的执行,可以对代码进行休眠 time.Sleep(time.Second) ,需要引入 time 包,代码每隔两秒也在执行,这相当于对异常和错误进行捕获。

2、代码如下:

package main

import(

"fmt"

"time"

)

func test( ) {

//使用 defer + recover 来捕获和处理异常

defer func( ) {

err := recover ( ) // recover( ) 内置函数,可以捕获到异常

if err != nil {  //说明捕获到错误

fmt.Println( "err=", err)

}

}

num1 := 10

num2 := 0

res ;= num1 / num2

fmt.Println( "res=", res)

}

func main() {

//测试

test()

fmt.Println( "main()下面的代码...")

time.Sleep(time.Second)  //休眠

}

3、 运行结果为:main< >下面的代码。

 

四、 错误处理的好处

1、进行错误处理后,程序不会轻易挂掉,如果加入预警代码,就可以让程序更加的健壮。

2、案例演示:

func test() {

//使用 defer + recover 来捕获和处理异常

defer func( {

err := recover()  // recover() 内置函数,可以捕获到异常

if err != nil {  //说明捕获到错误

fmt.Println( "err=", err)

//这里就可以将错误信息发送给管理员....

fmt.Println("发送邮件给admin@sohu. com~")

}

}

num1 := 10

num2 := 0

res := num1 / num2

fmt.Println( "res=", res)

}

3、代码分析:

fmt.Println( "err=", err) 这里就可以将错误信息发送给管理员....,GO 语言也有支持发送信息的机制,fmt.Println ("发送邮件给admin@sohu. com~") 。代码运行后,发送邮件给了管理员,代码还在继续执行。所以说,代码可以加入预警机制和相应的提示信息给管理员。

可以保证程序不崩溃,继续执行

捕获的 err 的时候,可以将信息发送给管理员

err := recover( ) 等价于 err:=recover( ),两种写法是相同的。

相关文章
|
7月前
|
Go 调度
GO语言函数的内部运行机制分析
以上就是Go语言中函数的内部运行机制的概述,展示了函数在Go语言编程中如何发挥作用,以及Go如何使用简洁高效的设计,使得代码更简单,更有逻辑性,更易于理解和维护。尽管这些内容深入了一些底层的概念,但我希望通过这种方式,将这些理论知识更生动、更形象地带给你,让你在理解的同时找到编程的乐趣。
162 5
|
7月前
|
安全 Go
defer关键字:延迟调用机制-《Go语言实战指南》
Go 语言中的 `defer` 是用于延迟执行函数调用的关键字,广泛应用于资源释放、异常捕获和日志记录等场景。它在函数返回前执行,支持栈式后进先出(LIFO)顺序,参数求值时机为声明时而非执行时。常见用法包括文件关闭、锁解锁及结合 `recover` 处理 panic。尽管高效,频繁使用可能带来性能开销,需谨慎处理。总结而言,`defer` 是构建健壮代码的核心工具之一。
|
8月前
|
存储 算法 物联网
解析局域网内控制电脑机制:基于 Go 语言链表算法的隐秘通信技术探究
数字化办公与物联网蓬勃发展的时代背景下,局域网内计算机控制已成为提升工作效率、达成设备协同管理的重要途径。无论是企业远程办公时的设备统一调度,还是智能家居系统中多设备间的联动控制,高效的数据传输与管理机制均构成实现局域网内计算机控制功能的核心要素。本文将深入探究 Go 语言中的链表数据结构,剖析其在局域网内计算机控制过程中,如何达成数据的有序存储与高效传输,并通过完整的 Go 语言代码示例展示其应用流程。
158 0
|
10月前
|
存储 算法 Go
Go语言实战:错误处理和panic_recover之自定义错误类型
本文深入探讨了Go语言中的错误处理和panic/recover机制,涵盖错误处理的基本概念、自定义错误类型的定义、panic和recover的工作原理及应用场景。通过具体代码示例介绍了如何定义自定义错误类型、检查和处理错误值,并使用panic和recover处理运行时错误。文章还讨论了错误处理在实际开发中的应用,如网络编程、文件操作和并发编程,并推荐了一些学习资源。最后展望了未来Go语言在错误处理方面的优化方向。
163 5
|
存储 安全 Go
Go 语言以其高效的并发编程能力著称,主要依赖于 goroutines 和 channels 两大核心机制
Go 语言以其高效的并发编程能力著称,主要依赖于 goroutines 和 channels 两大核心机制。本文介绍了这两者的概念、用法及如何结合使用,实现任务的高效并发执行与数据的安全传递,强调了并发编程中的注意事项,旨在帮助开发者更好地掌握 Go 语言的并发编程技巧。
184 2
Go to Learn Go之错误处理
Go to Learn Go之错误处理
122 8
Go语言的条件控制语句及循环语句的学习笔记
本文是Go语言的条件控制语句和循环语句的学习笔记,涵盖了if语句、if-else语句、if嵌套语句、switch语句、select语句以及for循环和相关循环控制语句的使用方法。
Go语言的条件控制语句及循环语句的学习笔记
|
存储 编译器 Go
Go: struct 结构体类型和指针【学习笔记记录】
本文是Go语言中struct结构体类型和指针的学习笔记,包括结构体的定义、成员访问、使用匿名字段,以及指针变量的声明使用、指针数组定义使用和函数传参修改值的方法。

热门文章

最新文章