golang如何防止意外崩溃


本文摘自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() {

  

// 发生宕机时,获取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("运行后")

}

对代码的说明:

阅读剩余部分

相关阅读 >>

手撸golang 结构型设计模式 装饰器模式

golang程序设计——函数

golang leaf用的多吗

聊聊dubbo-go-proxy的recoveryfilter

go - 常用签名算法的基准测试

教你用golang实现直播和点播功能

go module来了,企业私有代理你准备好了吗?

golang字符串国际化

golang fyne 使用中文并打包进二进制文件

关于golang中的错误处理机制的详细介绍

更多相关阅读请进入《golang》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...