recover 没有捕获异常_defer + recover 捕获所有异常
1)說明
go的異常捕獲需要延遲函數(shù)defer + recover實(shí)現(xiàn),在函數(shù)返回前,就可以捕獲到, 這樣其實(shí)比java的try catch更加優(yōu)雅一點(diǎn);
比如: web服務(wù)器程序崩潰前,需要做一些清理,那么就可以這樣搞定;
還可以在捕獲時(shí),打印一些信息,繼續(xù)panic,讓錯誤往上拋
2)案例
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 g() {
defer func() {
err := recover()
switch err.(type) {
case runtime.Error:
fmt.Println("g() runtime error:", err)
default:
fmt.Println("g() error:", err)
}
}()
var b *int
/*
注意: 這行改為*b = 1/0 這樣, 被除數(shù)是0,直接編譯報(bào)錯
$ go build main.go
# command-line-arguments
.\main.go:38:8: division by zero
*/
*b = 1
}
func main() {
fmt.Println("運(yùn)行前")
ProtectRun(func() {
fmt.Println("手動宕機(jī)前")
panic(&panicContext{"手動觸發(fā)panic"})
fmt.Println("手動宕機(jī)后")
})
ProtectRun(func() {
fmt.Println("賦值宕機(jī)前")
var a *int
*a = 1
fmt.Println("賦值宕機(jī)后")
})
g()
fmt.Println("運(yùn)行后")
}
/*
$ ./main.exe
運(yùn)行前
手動宕機(jī)前
error: &{手動觸發(fā)panic}
賦值宕機(jī)前
runtime error: runtime error: invalid memory address or nil pointer dereference
g() runtime error: runtime error: invalid memory address or nil pointer dereference
運(yùn)行后
*/
來源:oschina
鏈接:https://my.oschina.net/u/4368807/blog/4327637
總結(jié)
以上是生活随笔為你收集整理的recover 没有捕获异常_defer + recover 捕获所有异常的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构之并查集:并查集的介绍与Pyth
- 下一篇: python或anaconda下安装op