Golang错误处理函数defer、panic、recover、errors.New介绍
- 在默认情况下,当发生错误(panic)后,程序就会终止运行
- 如果发生错误后,可以捕获错误,并通知管理人员(邮件或者短信),程序还可以继续运行,这当然无可厚非
- errors.New("错误信息"),会返回一个error类型的值,表示一个错误
- panic内置函数,接收一个interface()类型的值(也就是任何值都可以)作为参数,可以接收error类型的变量,输出错误信息,并退出程序
- GO语言追求简洁优雅,GO语言不类似php支出try catch操作
- GO语言中引入的处理方式为:defer、panic、recover
- GO可以抛出一个panic异常。然后在defer中通过recover捕获异常再处理
自定义错误处理运用
package main
import (
"fmt"
"errors"
) //此函数读取配置文件信息
//如果文件名不正确,返回自定义错误
func readConfFile(FileName string) (err error) { //返回error类型
if FileName == "config.ini" {
return nil //表示没有错误
} else {
return errors.New("读取文件错误")
}
} func error_func(){
err := readConfFile("config.ini") //这里故意写错,报错代码在第一块,如果写对,在第二块
if err != nil {
//如果读取文件发生错误,就输出这个错误,并终止程序
panic(err) //这个函数作用是打印错误信息,并终止程序
}
fmt.Println("error_func()继续执行")
}
func main() {
error_func()
fmt.Printf("发生错误后面的代码")
} //【报错信息】
//一、
// panic: 读取文件错误 // goroutine 1 [running]:
// main.error_func()
// D:/goproject/src/main/hello.go:22 +0xdf
// main.main()
// D:/goproject/src/main/hello.go:27 +0x27
// exit status 2 //二、
// error_func()继续执行
// 发生错误后面的代码
recover+defer的运用
package main
import (
"fmt"
"time"
) //这里举例,在数学计算中0是不可以作为被除数的
func error_func() {
//这里使用defer + recover来捕获处理异常
defer func() { //defer就是把匿名函数压入到defer栈中,等到执行完毕后或者发生异常后调用匿名函数
err := recover() //recover是内置函数,可以捕获到异常
if err != nil { //说明有错误
fmt.Println("err=", err)
//当然这里可以把错误的详细位置发送给开发人员
//send email to admin
}
}()
num1 :=
num2 :=
res := num1 / num2
fmt.Println("res=", res)
} func main() {
//这样程序不会轻易挂掉
error_func()
i :=
for {
i++
fmt.Println("发生错误后面的代码", i)
time.Sleep(time.Second)
} }
defer语句是在return之后执行的,例如:
func test() (result int) {
defer func() {
result =
}()
return
}
func main() {
fmt.Println(test()) //
}
在一个函数中panic被调用后,其defer语句仍会执行,例如:
package main
import (
"fmt"
"errors"
) func foo()(n int) {
defer func() {
if r := recover(); r != nil {
fmt.Println("再然后④\n")
n++
fmt.Println("最后⑤\n")
}
}()
fmt.Println("首先①\n")
n++
fmt.Printf("然后②n=%v\n" ,n)
fmt.Println("然后③\n")
panic(errors.New("i'm a bug"))
fmt.Println("没走\n") return n
}
func main() {
n := foo()
fmt.Printf("n最后的值%v", n)
}
首先①
然后②n=
然后③
再然后④
最后⑤
n最后的值2
Golang错误处理函数defer、panic、recover、errors.New介绍的更多相关文章
- defer,panic,recover
Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱.因为开发者很容易滥用异常,甚至一个小小的错误都抛出一个 ...
- 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: ...
- Golang 高效实践之defer、panic、recover实践
前言 我们知道Golang处理异常是用error返回的方式,然后调用方根据error的值走不同的处理逻辑.但是,如果程序触发其他的严重异常,比如说数组越界,程序就要直接崩溃.Golang有没有一种异常 ...
随机推荐
- 邮件收取客户端LumiSoft类库接收yahoo邮件的问题。
//开始循环取邮件数据 m_pImap.Fetch( false, IMAP_t_SeqSet.Parse("1:*"), new IMAP_t_Fetch_i[]{ new IM ...
- Linux基础(二)centOS7密码重置
之前安装linux的时候,为了安全起见,起了一个非常特别的,长的密码.然后,就不记得了密码. 下面通过进入单用户模式,就行挽救. 1>重启系统,在系统菜单选择页按 [上下方向键],使界面停在该界 ...
- 收集:C# WinForm获取当前路径汇总
Winform获取应用程序的当前路径的方法集合,具体如下,值得收藏 //获取当前进程的完整路径,包含文件名(进程名). string str = this.GetType().Assembly.Loc ...
- spring之文件上传
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- windows 服务器硬盘的分区
进入Server 2012的操作系统,打开CMD框,输入:diskmgmt.msc,回车. 操作完第一步后会弹出“磁盘管理”的框.鼠标右键点击红框所在位置,选中“压缩卷”. 在“输入压缩空间量(MB) ...
- webpack使用三
Webpack的强大功能 生成Source Maps(使调试更容易) 开发总是离不开调试,方便的调试能极大的提高开发效率,不过有时候通过打包后的文件,你是不容易找到出错了的地方,对应的你写的代码的位置 ...
- JDK源码调试常见错误。
1.删除不需要的代码,即swing相关的代码 2.执行命令时要将前提环境进入文件夹如下: 起初没有完全执行第一条,因为网上说可以根据需要选择相关的代码,于是就没有删除,以后第一次模仿网上的例子的时候要 ...
- CentOS下Docker安装
CentOS下Docker安装 1.安装: #sudo yum install docker 2.启动并加入开机启动: A.#sudo systemctl start docker B.#sudo s ...
- json为txt文本加密
我们知道json是一种数据传输的加密格式 这里为txt格式的文本加密(纯属无聊) 写的比较凌乱,查找你输入的两个文件夹下面的所有txt文件(包含下一级文件): 运行时要注意,别把重要文件给加密了 ...
- Python全栈-网络编程-TCP粘包
一.什么是TCP粘包 C/S架构下,接收方不知道每个消息的发送间隙.也不知道每次应该提取多少个字节的数据,与此同时,TCP是面向连接的,面向流的,收发两端都要有,因此发送端为了将多个发往接收端的数据包 ...