面试题答案
一键面试设计思路
- 分层设计:将程序分为不同的层次,例如业务逻辑层、数据访问层等。这样可以明确各个模块的职责,并且在不同层次捕获和处理错误。
- 使用defer和recover:在需要捕获panic的地方使用defer关键字定义一个函数,在这个函数中使用recover函数来捕获panic。
- 错误封装:将捕获到的panic信息封装成自定义的错误类型,以便携带更多的上下文信息,同时不丢失关键的错误信息。
核心代码示例
package main
import (
"fmt"
)
// 自定义错误类型
type BusinessError struct {
ErrMsg string
}
func (be BusinessError) Error() string {
return be.ErrMsg
}
// 模拟可能触发panic的函数
func riskyFunction() {
panic(BusinessError{ErrMsg: "业务条件触发严重错误"})
}
// 捕获panic的函数
func handlePanic() {
defer func() {
if r := recover(); r != nil {
if err, ok := r.(BusinessError); ok {
fmt.Printf("捕获到业务错误: %v\n", err)
} else {
fmt.Printf("捕获到未知错误: %v\n", r)
}
}
}()
riskyFunction()
}
func main() {
handlePanic()
fmt.Println("程序继续正常运行")
}
在上述代码中:
BusinessError
是自定义的错误类型,实现了error
接口。riskyFunction
模拟了可能触发panic的业务函数。handlePanic
函数使用defer
和recover
来捕获riskyFunction
可能触发的panic,并对其进行处理。如果捕获到的是BusinessError
类型的错误,则打印业务错误信息;如果是其他类型的错误,则打印未知错误信息。main
函数调用handlePanic
函数,在捕获并处理panic后,程序能够继续正常运行。