本文摘自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( "运行后" )
}
|
对代码的说明:
阅读剩余部分
相关阅读 >>
gin快速入门
ssh连接服务器后执行多条命令
go中sync.cond源码解读
golang 如何模块化
2017年最适合go新手的十本书
golang怎么搭一个网站
手撸golang go与微服务 chatserver之1
关于go get超时的问题
手撸golang 行为型设计模式 中介者模式
golang核心编程
更多相关阅读请进入《golang》频道 >>
老貘
一个与时俱进的Go编程知识库。
转载请注明出处:木庄网络博客 » golang如何防止意外崩溃