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