// $GOROOT/src/bytes/buffer.gofunc makeSlice(n int) []byte { // If the make fails, give a known error. defer func() { if recover() != nil { panic(ErrTooLarge) // 触发一个新panic } }() return make([]byte, n)}
defer function 中是用 recover 是 Golang 中唯一从 panic 中恢复的手段,能够拦截运行时中的 panic,但是对运行时之外触发的崩溃无法捕获,比如调用 C 语言的库,C 语言中发生的崩溃。
2. 修改函数的具名返回值
下面是一个标准库中的例子:
// $GOROOT/src/fmt/scan.gofunc (s *ss) Token(skipSpace bool, f func(rune) bool) (tok []byte, err error) { defer func() { if e := recover(); e != nil { if se, ok := e.(scanError); ok { err = se.err } else { panic(e) } } }() ...}