您现在的位置是:群英 > 开发技术 > 编程语言
golang防止意外崩溃的方法是什么?
Admin发表于 2022-06-28 17:08:05861 次浏览
在实际案例的操作过程中,我们可能会遇到“golang防止意外崩溃的方法是什么?”这样的问题,那么我们该如何处理和解决这样的情况呢?这篇小编就给大家总结了一些方法,具有一定的借鉴价值,希望对大家有所帮助,接下来就让小编带领大家一起了解看看吧。

无论是代码运行错误由 Runtime 层抛出的 panic 崩溃,还是主动触发的 panic 崩溃,都可以配合 defer 和 recover 实现错误捕捉和恢复,让代码在发生崩溃后允许继续运行。

Go 没有异常系统,其使用 panic 触发宕机类似于其他语言的抛出异常,那么 recover 的宕机恢复机制就对应 try/catch 机制。

让程序在崩溃时继续执行

下面的代码实现了 ProtectRun() 函数,该函数传入一个匿名函数或闭包后的执行函数,当传入函数以任何形式发生 panic 崩溃后,可以将崩溃发生的错误打印出来,同时允许后面的代码继续运行,不会造成整个进程的崩溃。

保护运行函数:

package main
 
import (
"fmt"
"runtime"
)
 
// 崩溃时需要传递的上下文信息
type panicContext struct {
function string // 所在函数
}
 
// 保护方式允许一个函数
func ProtectRun(entry func()) {
 
// 延迟处理的函数
defer func() {
 
// 发生宕机时,获取panic传递的上下文并打印
err := recover()
 
switch err.(type) {
case runtime.Error: // 运行时错误
fmt.Println("runtime error:", err)
default: // 非运行时错误
fmt.Println("error:", err)
}
 
}()
 
entry()
 
}
 
func main() {
fmt.Println("运行前")
 
// 允许一段手动触发的错误
ProtectRun(func() {
 
fmt.Println("手动宕机前")
 
// 使用panic传递上下文
panic(&panicContext{
"手动触发panic",
})
 
fmt.Println("手动宕机后")
})
 
// 故意造成空指针访问错误
ProtectRun(func() {
 
fmt.Println("赋值宕机前")
 
var a *int
*a = 1
 
fmt.Println("赋值宕机后")
})
 
fmt.Println("运行后")
}

对代码的说明:

第 9 行声明描述错误的结构体,成员保存错误的执行函数。

第 17 行使用 defer 将闭包延迟执行,当 panic 触发崩溃时,ProtectRun() 函数将结束运行,此时 defer 后的闭包将会发生调用。

第 20 行,recover() 获取到 panic 传入的参数。

第 22 行,使用 switch 对 err 变量进行类型断言。

第 23 行,如果错误是有 Runtime 层抛出的运行时错误,如空指针访问、除数为 0 等情况,打印运行时错误。

第 25 行,其他错误,打印传递过来的错误数据。

第 44 行,使用 panic 手动触发一个错误,并将一个结构体附带信息传递过去,此时,recover 就会获取到这个结构体信息,并打印出来。

第 57 行,模拟代码中空指针赋值造成的错误,此时会由 Runtime 层抛出错误,被 ProtectRun() 函数的 recover() 函数捕获到。

panic和recover的关系

panic 和 defer 的组合有如下特性:

有 panic 没 recover,程序宕机。

有 panic 也有 recover 捕获,程序不会宕机。执行完对应的 defer 后,从宕机点退出当前函数后继续执行。




感谢各位的阅读,以上就是“golang防止意外崩溃的方法是什么?”的内容了,通过以上内容的阐述,相信大家对golang防止意外崩溃的方法是什么?已经有了进一步的了解,如果想要了解更多相关的内容,欢迎关注群英网络,群英网络将为大家推送更多相关知识点的文章。

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

标签: Golang
相关信息推荐
2022-05-09 17:27:30 
摘要:本文对Python的二元算术运算详解。
2022-05-16 11:39:20 
摘要:本篇文章给大家带来的内容是关于canvas实现压缩图片的代码示例,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
2022-01-21 17:36:09 
摘要:这篇文章我们来了解Java中volatile关键字的作用,volatile关键字的作用有三点,分别是保证可见性、保证有序性和提供double check。下文有很详细的介绍,有需要的朋友可以参考,接下来就跟随小编来一起学习一下吧!
云活动
推荐内容
热门关键词
热门信息
群英网络助力开启安全的云计算之旅
立即注册,领取新人大礼包
  • 联系我们
  • 24小时售后:4006784567
  • 24小时TEL :0668-2555666
  • 售前咨询TEL:400-678-4567

  • 官方微信

    官方微信
Copyright  ©  QY  Network  Company  Ltd. All  Rights  Reserved. 2003-2019  群英网络  版权所有   茂名市群英网络有限公司
增值电信经营许可证 : B1.B2-20140078   粤ICP备09006778号
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
微信公众号
返回顶部
返回顶部 返回顶部