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有没有一种异常 ...
随机推荐
- (转)ThreadLocal-面试必问深度解析
ThreadLocal是什么 ThreadLocal是一个本地线程副本变量工具类.主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用, ...
- bootstrap modal与select2使用冲突解决
今天发现项目使用bootstrap modal 与 jquery select2 结合时发现select2不起作用,点击select框不显示选项,查阅资料后发现是因为modal层遮挡了select2的 ...
- Ubuntu16.04源的问题
今天执行下列语句 sudo apt-get update报错 安装redis时 sudo apt-get install redis-server报错 报错内容大致如下: 在网上查了一下是源的问题,我 ...
- mac控制台快捷键
ctrl+a //移到行首ctrl+e //移到行尾 ctrl+y // 插入最近删除的单词或语句ctrl+k //删除光标处到行尾部分ctrl+u //删除光标处到行首部分ctrl+w //删除光标 ...
- Geckofx 45 正确模拟键盘输入的事件绑定方法
var inputs = selection.GetElementsByTagName("input").Select(p => p as Gecko.DOM.GeckoIn ...
- VB脚本错误,系统找不到制定的文件 。代码:80070002
希望得到网友的答案:非常感谢!
- import caffe报错问题
在搭建好的caffe环境下运行Python报错:ImportError:No module named _caffe 报错原因:由于caffe的Python环境变量未配置好 解决方案: 方法1 imp ...
- orm查询语法参考文章
1.参考博客 http://blog.csdn.net/OyangYujun/article/details/45938905 ORMLite完全解析(三)官方文档第三章.自定义查询构造器 Custo ...
- OpenGL and Vulkan resources
OpenGL https://www.zhihu.com/question/22005157https://open.gl/https://github.com/cybercser/OpenGL_3_ ...
- JSP中的编码问题
JSP文件的编码 <%@ page contentType="text/html;charset=UTF-8" language="java" %> ...