本文摘自php中文网,作者尚,侵删。

无论是代码运行错误由 Runtime 层抛出的 panic 崩溃,还是主动触发的 panic 崩溃,都可以配合 defer 和 recover 实现错误捕捉和恢复,让代码在发生崩溃后允许继续运行。
Go 没有异常系统,其使用 panic 触发宕机类似于其他语言的抛出异常,那么 recover 的宕机恢复机制就对应 try/catch 机制。
让程序在崩溃时继续执行
下面的代码实现了 ProtectRun() 函数,该函数传入一个匿名函数或闭包后的执行函数,当传入函数以任何形式发生 panic 崩溃后,可以将崩溃发生的错误打印出来,同时允许后面的代码继续运行,不会造成整个进程的崩溃。
保护运行函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | package main
import (
"fmt"
"runtime"
)
type panicContext struct {
function string
}
func ProtectRun(entry func()) {
defer func() {
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(&panicContext{
"手动触发panic" ,
})
fmt.Println( "手动宕机后" )
})
ProtectRun(func() {
fmt.Println( "赋值宕机前" )
var a *int
*a = 1
fmt.Println( "赋值宕机后" )
})
fmt.Println( "运行后" )
}
|
对代码的说明:
阅读剩余部分
相关阅读 >>
go语言标准库之time
go关于tpl文件无法读取域中数据{{$.name}}
2021-03-18 golang 以太坊大额转账转换问题
golang之sync.pool对象池对象重用机制总结
gin 中实现 http basic auth
golang底层是c语言吗?
golang panic after defer?
聊聊dapr的limiter
go语言标准库之fmt
protoc go插件编写之三 (自定义选项)
更多相关阅读请进入《golang》频道 >>
老貘
一个与时俱进的Go编程知识库。
转载请注明出处:木庄网络博客 » golang如何防止意外崩溃