对 recover 的冗余调用¶
ID: go/redundant-recover
Kind: problem
Security severity:
Severity: warning
Precision: high
Tags:
- maintainability
- correctness
Query suites:
- go-security-and-quality.qls
内置的 recover
函数仅在延迟函数内部有用。在从未延迟的函数中调用它意味着它将始终返回 nil
,并且它永远不会重新获得对 panic goroutine 的控制。直接在 defer 语句中调用 recover
也是如此。
建议¶
仔细检查代码,以确定它是否是应该修复的错误。
示例¶
在下面的示例中,函数 fun1
旨在从 panic 中恢复。但是,延迟的函数调用另一个函数,该函数然后调用 recover
package main
import "fmt"
func callRecover1() {
if recover() != nil {
fmt.Printf("recovered")
}
}
func fun1() {
defer func() {
callRecover1()
}()
panic("1")
}
可以通过延迟对调用 recover
的函数的调用来解决此问题
package main
import "fmt"
func callRecover1Good() {
if recover() != nil {
fmt.Printf("recovered")
}
}
func fun1Good() {
defer callRecover1Good()
panic("1")
}
在以下示例中,recover
直接在 defer 语句中调用,这没有任何效果,因此不会捕获 panic。
package main
func fun2() {
defer recover()
panic("2")
}
我们可以通过延迟调用 recover
的匿名函数来解决此问题。
package main
func fun2Good() {
defer func() { recover() }()
panic("2")
}