当前位置: 首页 > article >正文

golang recover错误

可以recover的错误

  1. 显式触发的panic
    通过panic("error message")主动抛出的错误,只要在同一goroutinedefer链中调用recover,即可捕获并恢复。

    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered:", r)
        }
    }()
    panic("user-triggered panic")
    
  2. 运行时错误(部分)
    如切片越界、类型断言失败、空指针解引用等运行时panic,只要在defer中正确使用recover技术上可以捕获。但程序可能处于不可信状态,继续执行需谨慎。

    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered from runtime error:", r)
        }
    }()
    var a []int
    fmt.Println(a[10]) // 越界访问,触发panic
    
  3. 自定义类型错误
    通过panic抛出自定义类型(如结构体或错误接口),recover可以捕获并处理。

    panic(fmt.Errorf("custom error"))
    

不能recover的错误

  1. 其他goroutine未处理的panic
    每个goroutine需独立处理自己的panic。若某goroutine未在其内部defer中调用recover,该panic会导致整个程序崩溃,主goroutine无法捕获。

    go func() {
        panic("goroutine panic") // 主goroutine无法捕获此panic
    }()
    
  2. 程序已终止的情况
    若已调用os.Exit()或发生致命错误(如内存耗尽),recover无法恢复。

  3. defer上下文中的panic
    recover仅在defer函数中调用有效,且必须位于触发panic的同一函数调用栈中。

    func main() {
        panic("panic outside defer") // 无法被后续的defer捕获
        defer func() { recover() }() // 此处defer不会执行
    }
    
  4. 重复调用panic
    若在defer中再次触发panic且未被捕获,程序仍会崩溃。

    defer func() {
        recover()
        panic("re-panic") // 未被捕获,导致程序终止
    }()
    panic("initial panic")
    
  5. CGO或系统级错误(部分)
    某些底层系统错误(如栈溢出、内存段错误)可能绕过Go的panic/recover机制,直接终止程序。


关键规则总结

  1. 作用域限制
    recover仅在当前goroutine的defer函数中有效。

  2. 运行时错误的可恢复性
    技术上可捕获,但程序状态可能损坏,需谨慎处理。

  3. 设计建议

    • 仅对可预测的错误使用panic/recover(如输入验证失败)。
    • 避免依赖recover处理不可恢复错误(如内存越界),应确保程序健壮性。

通过合理使用deferrecover,可以优雅处理局部错误,但需理解其局限性以避免误用。


http://www.kler.cn/a/581300.html

相关文章:

  • OpenGL ES ->帧缓冲对象(Frame Buffer Object)离屏渲染获取纹理贴图
  • 【6】字典树学习笔记
  • ClusterIP、Headless Service 和 NodePort 的比较
  • 如何提取神经网络中间层特征向量
  • 责任链模式的C++实现示例
  • 软考高级信息系统项目管理师笔记-第19章配置与变更管理
  • 接口自动化入门 —— swagger/word/excelpdf等不同种类的接口文档理解!
  • Ollama杂记
  • 【CXX】6.4 CxxString — std::string
  • LeetCode100之二叉树的直径(543)--Java
  • 牵引线标注:让地图信息更清晰的ArcGIS Pro技巧
  • 制作自定义镜像
  • docker-compose Install m3e(fastgpt扩展) GPU模式
  • 跨公网 NAT 配置方案:实现高效网络通信与安全访问
  • 关于在vue3中使用keep-live+component标签组合,实现对指定某些组件进行缓存或不缓存的问题
  • 【软考-架构】2.3、设备管理-文件管理
  • flinkOracleCdc任务报错kafkaConnectSchema
  • 基于 Simulink 的超级储能参与电网一次调频仿真研究
  • 怎么删除百度搜索下拉框里的搜索引导词
  • KTH31XX 系列_比例式线性霍尔效应传感器,模拟电压输出