golang recover错误

ops/2025/3/14 21:37:45/

可以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.ppmy.cn/ops/165485.html

相关文章

vulnhub-DC-9 SQL注入、“ssh端口敲门”、hydra爆破

vulnhub-DC-9 SQL注入、“ssh端口敲门”、hydra爆破 一、信息收集 2025.3.12 AM 9:15 1、首先拿到靶场先扫一下ip arp-scan -l 2、指纹扫描 nmmap -sS -T4 -A 192.168.66.181 看看开放哪些端口 PORT STATE SERVICE VERSION 22/tcp filtered ssh 80/tcp open http…

CDefView::_GetPIDL函数分析之ListView_GetItem函数的参数item的item.mask 为LVIF_PARAM

CDefView::_GetPIDL函数分析之ListView_GetItem函数的参数item的item.mask 为LVIF_PARAM 第一部分: 1: kd> t SHELL32!CDefView::_GetPIDL: 001b:77308013 55 push ebp 1: kd> dv this 0x00000015 i 0n21 …

如何使用Cursor的claude-3.7模型来开发高保真的原型设计图,学会写好的提示词人人都是设计师

1、想要开发出高保真的设计图原型,需要给出cursor具体的提示词:比如我想开发一款IT面试题小程序,给出的提示词是这样的 我想开发一个 {IT面试题库小程序},现在需要输出高保真的原型图,请通过以下方式帮我完成所有界面…

【DNS系列】使用TCP传输

DNS ​默认使用UDP协议​(端口53)进行通信,但在以下场景中会切换到TCP协议​(端口53): ​1. 响应数据过大(超过512字节)​ ​UDP限制:DNS的UDP协议默认限制单个数据包大…

基于Redis实现限流

限流尽可能在满足需求的情况下越简单越好! 1、基于Redsi的increment方法实现固定窗口限流 Redis的increment方法保证并发线程安全窗口尽可能越小越好(太大可能某一小段时间就打满请求剩下的都拿不到令牌了)这个原理其实就是用当前时间戳然后除窗口大小 在这个窗口大…

视频推拉流:EasyDSS平台直播通道重连转推失败原因排查与解决

视频推拉流EasyDSS视频直播点播平台,集视频直播、点播、转码、管理、录像、检索、时移回看等功能于一体,可提供音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务。 用户使用EasyDSS平台对直播通道进行转推,发现只要关闭…

机器学习—赵卫东阅读笔记(一)

第一章:机器学习基础 1.1.2 机器学习主要流派 1.符号主义 2.贝叶斯分类——基础是贝叶斯定理 3.联结主义——源于神经学,主要算法是神经网络。——BP算法:作为一种监督学习算法,训练神经网络时通过不断反馈当前网络计算结果与…

vb编程有哪些相关的IDE开发工具vb.net,Basic语言?

在编程领域,VB 系列拥有丰富多样的 IDE 开发工具,为不同需求的开发者提供了广泛的选择,以下为你详细介绍: 兼容 VB6 源码的开发工具 twinbasic:属于 VB7 系列,它几乎能 100% 兼容 VB6 源码,这…