如何将recover()捕获的runtime.boundError类型panic转换为字符串存储?
将Go中捕获的runtime.boundError类型panic转为字符串存储
要把捕获到的runtime.boundError类型panic转为字符串存储,你可以利用Go的类型断言和标准库工具处理,以下是两种可靠方案:
方案1:通用转换(适配所有panic类型)
使用fmt.Sprintf("%v", r)可以将任意类型的panic值转为字符串,包括runtime.boundError——该类型实现了fmt.Stringer接口,%v格式化会自动调用其对应的字符串输出方法。
示例代码:
import "fmt" func main() { defer func() { if recovered := recover(); recovered != nil { panicStr := fmt.Sprintf("%v", recovered) // 此处可将panicStr存入变量、文件或数据库 fmt.Printf("捕获到panic:%s\n", panicStr) } }() // 触发runtime.boundError(切片越界示例) s := []int{1, 2, 3} _ = s[10] }
方案2:针对error类型的精准转换
runtime.boundError实现了标准error接口,因此可以先将recover的结果断言为error类型,再调用Error()方法获取错误字符串。这种方式更直接,适合明确panic值为error类型的场景:
示例代码:
import "fmt" func main() { defer func() { if recovered := recover(); recovered != nil { var panicStr string // 尝试断言为error类型 if err, ok := recovered.(error); ok { panicStr = err.Error() } else { // 非error类型的panic,降级为通用转换 panicStr = fmt.Sprintf("%v", recovered) } // 后续使用panicStr fmt.Printf("捕获到panic:%s\n", panicStr) } }() // 触发runtime.boundError s := []int{1, 2, 3} _ = s[10] }
注意:runtime.boundError是Go标准库的未导出内部类型,你无法直接断言为runtime.boundError,只能通过error接口间接访问其错误信息。
内容的提问来源于stack exchange,提问作者Turtle
相关产品推荐
相关产品推荐

