defer,panic,recover
Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱。因为开发者很容易滥用异常,甚至一个小小的错误都抛出一个异常。在Go语言中,使用多值返回来返回错误。不要用异常代替错误,更不要用来控制流程。在极个别的情况下,也就是说,遇到真正的异常的情况下(比如除数为0了)。才使用Go中引入的Exception处理:defer, panic, recover。流程可以简要描述为:在代码片段中抛出一个panic的异常,然后在defer中通过recover捕获这个异常,然后正常处理
一.使用多返回值来处理错误
import (
"errors"
"fmt"
) func Handle(i int) (int, error) {
if i == 0 {
return i, errors.New("除数为0")
}
return 100 / i, nil
} func main() {
if divint, err := Handle(0); err != nil {
fmt.Println(err)
} else {
fmt.Println(divint)
}
}
二.defer
defer就是用来添加函数结束时执行的语句.因为这个特性,可以将其用作关闭文件句柄等.
func Handle(i int) (res int) {
res = i
defer func() {
res++
}()
return res
}
func main() {
i := Handle(0)
fmt.Println(i)
}
打印出1, 因为defer中添加了一个函数,在函数返回前改变了命名返回值的值.如果defer语句没有执行,那么defer函数不会添加.
func Handle(i int) (res int) {
res = i
return res // 直接返回了,defer没有执行
defer func() {
res++
}()
return res
}
func main() {
i := Handle(0)
fmt.Println(i)
}
二.panic
panic 是用来表示非常严重的不可恢复的错误的.可以理解为一般语言的 throw new Exception().调用panic看看,程序立马挂掉,然后Go运行时会打印出调用栈.
关键的一点是,即使函数执行的时候panic了,函数不往下走了,运行时并不是立刻向上传递panic,而是到defer那,等defer的东西都跑完了,panic再向上传递。所以这时候 defer 有点类似 try-catch-finally 中的 finally。\
三.recover
捕获panic,被捕获到的panic就不会向上传递了.不过要注意,recover之后,逻辑并不会恢复到panic那个点去,函数还是会在defer之后返回.
用Go实现类似 try catch 的异常处理:
import (
"fmt"
) func Handle(i int) (res int) {
if i == 0 {
panic("被除数为0")
}
res = i / 2
return res
} func main() {
defer func() {
if err := recover(); err != nil {
fmt.Println(err)
}
}()
Handle(0)
}
defer,panic,recover的更多相关文章
- Go语言异常处理defer\panic\recover
Go语言追求简洁优雅,所以,Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱.因为开发者很容易滥用异常, ...
- defer, panic, recover使用总结
1. defer : 延迟调用.多个defer,依次入栈,在函数即将退出时,依次出栈调用 package main import "fmt" func main() { defer ...
- Go的异常处理 defer, panic, recover
Go语言追求简洁优雅,所以,Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱.因为开发者很容易滥用异常, ...
- go语言defer panic recover用法总结
defer defer是go提供的一种资源处理的方式.defer的用法遵循3个原则 在defer表达式被运算的同时,defer函数的参数也会被运算.如下defer的表达式println运算的同时,其入 ...
- Golang 入门系列(十四)defer, panic和recover用法
以前讲过golang 的基本语法.但是,只是讲了一些基础的语法,感兴趣的可以看看以前的文章,https://www.cnblogs.com/zhangweizhong/category/1275863 ...
- go panic recover 异常处理
Go语言追求简洁优雅,所以,Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱.因为开发者很容易滥用异常, ...
- GOLANG错误处理最佳方案errors wrap, Defer, Panic, and Recover
Simple error handling primitives: https://github.com/pkg/errors Defer, Panic, and Recover: ...
- 15 Defer, Panic, and Recover
Defer, Panic, and Recover 4 August 2010 Go has the usual mechanisms for control flow: if, for, switc ...
- 6.Go-错误,defer,panic和recover
6.1.错误 Go语言中使用builtin包下error接口作为错误类型 Go语言中错误都作为方法/函数的返回值 自定义错误类型 //Learn_Go/main.go package main imp ...
随机推荐
- sqlmap注入一般步骤
1. 找到注入点url2. sqlmap -u url -v 1--dbs 列出数据库或者 sqlmap -u url -v 1 --current-db 显示当前数据库3. sqlmap -u ur ...
- python--enum
# enum用于枚举,该模块下有一个Enum,我们定义的类要继承它 # 一旦继承,那么我们定义的key(仮),不能有重复值. # 如果要保证value(仮)不重复,那就引入unique,给我们定义的类 ...
- Javascript报错Converting circular structure to JSON 错误排解
在运行nodejs程序的时候报出以下的错误: 2017-11-20 17:44 +08:00: TypeError: Converting circular structure to JSON at ...
- itatis中的数据库配置
<!--com.microsoft.sqlserver.jdbc.SQLServerDriver --> <property name="JDBC.Driver" ...
- Linux使用命令记录
1.对一个文件夹中所有的文件进行修改权限: • chmod –R 777 aa (- R 递归式改变指定目录及其所目录文件拥者) • 目录/his及其所文件目录,chown - R www.www / ...
- 制作servlet模板
制作servlet模板 选中window-->preference--->搜索template--->选中java下面的template new一个 Name的设置,当你在eclip ...
- 处理eq问题
using System;using System.Diagnostics;using System.Drawing;using System.IO;using System.Windows.Form ...
- nginx安全日志分析脚本的编写
https://blog.csdn.net/nextdoor6/article/details/51914966
- css3帮你轻松实现圆角效果,不一样的前端页面。
在Web前端页面实现圆角效果,CSS3帮你轻松实现,一个人人皆知的属性 圆角边框的绘制是Web页面和Web应用程序中经常用来美化页面效果的手法之一.今天,小编为大家介绍CSS3提供的可以将矩形变为圆角 ...
- 2017 ACM-ICPC Asia Xi'an Problem A XOR(异或线性基 )
题目链接 2017西安赛区 Problem A 题意 给定一个数列,和$q$个询问,每个询问中我们可以在区间$[L, R]$中选出一些数. 假设我们选出来的这个数列为$A[i_{1}]$, $A[ ...