4.7. 宕机-panic

Go语言可以在程序中手动触发宕机,让程序崩溃,这样开发者可以及时地发现错误,同时减少可能的损失。

4.7.1. 1.手动触发宕机

package main

func main() {
    panic("crash")
}

/*代码运行崩溃,并输出如下
panic: crash

goroutine 1 [running]:
main.main()
D:/go_studay/go_path/src/awesomeProject12/panic01.go:4 +0x40*/

4.7.2. 2.在运行依赖的必备资源缺失时主动触发宕机

regexp是Go语言的正则表达式包,正则表达式需要编译后才能使用,而且编译必须是成功的。 表示正则表达式可用。

编译正则表达式函数有两种,具体如下:

func Compile(expr string) (*Regexp, error)

编译正常表达式,发生错误时返回编译错误,Regexp为nil,该函数适用于在编译错误时获得编译错误进行处理,同时继续后续执行的环境


func MustCompile(str string) *Regexp {
    regexp, err := Compile(str)
    if err != nil {
        panic(`regexp: Compile(` + quote(str) + `): ` + err.Error())
    }
    return regexp
}

· 编译正则表达式函数入口,输入包含正则表达式的字符串,返回正则表达式对象
· 调用Compile()是编译正则表达式的入口函数,返回编译好的正则表达式对象和错误
· 如果出现错误,触发panic()宕机
· 没有错误时返回正则表达式对象

手动宕机进行报错的方式不是一种偷懒的方式,反而能迅速报错,终止程序继续运行,防止更大的错误产生。 不过,任何错误都使用宕机处理,也不是一种良好的设计。因此根据需要来觉得十分使用宕机进行报错。

4.7.3. 3.在宕机时触发延迟执行语句

当panic()触发的宕机发生时,panic()后面的代码将不会被运行,但是在panic()函数前面 已经运行过的defer语句依然会在宕机发生时发生作用。参考如下代码:

package main

import "fmt"

func main() {
    defer fmt.Println("宕机前要做的事情1")
    defer fmt.Println("宕机前要做的事情2")
    panic("宕机")
}

/*
宕机前要做的事情2
宕机前要做的事情1
panic: 宕机

goroutine 1 [running]:
main.main()
D:/go_studay/go_path/src/awesomeProject12/panic02.go:8 +0x147
*/

宕机前defer语句会优先被执行,这个特性可以在宕机前进行信息处理。