惠州市企业网站seo点击软件,文案代写在哪里接单子,广告设计公司营业执照,管理咨询公司经营范围有哪些recover 使用panic抛出异常后, 将立即停止当前函数的执行并运行所有被defer的函数#xff0c;然后将panic抛向上一层#xff0c;直至程序crash。但是也可以使用被defer的recover函数来捕获异常阻止程序的崩溃#xff0c;recover只有被defer后才是有意义的。 func main() { p… recover 使用panic抛出异常后, 将立即停止当前函数的执行并运行所有被defer的函数然后将panic抛向上一层直至程序crash。但是也可以使用被defer的recover函数来捕获异常阻止程序的崩溃recover只有被defer后才是有意义的。 func main() { print(123) print(456) panic(throw an error) print(678) //IDE会有提示: Unreachable code} 结果: 123456panic: throw an errorgoroutine 1 [running]:main.main() /Users/shuangcui/explore/panicandrecover.go:31 0x67 使用recover()捕获异常: func main() { print(123) defer func() { if err : recover(); err ! nil { print(recover it) } }() print(456) panic(throw an error) print(678) //IDE会有提示: Unreachable code} 结果为: 123456recover it 如果有两个recover,则捕获异常的是后一个 func main() { print(123) defer func() { if err : recover(); err ! nil { print(recover it) } }() defer func() { if err : recover(); err ! nil { print(复原!) } }() print(456) panic(throw an error) print(678) //IDE会有提示: Unreachable code} 结果为: 123456复原! panic之后的任何代码都不会继续执行 前提是panic不在if里面 package mainimport fmtfunc main() { defer_call() fmt.Println(333 Helloworld)}func defer_call() { defer func() { fmt.Println(11111) }() defer func() { fmt.Println(22222) }() defer func() { if r : recover(); r ! nil { fmt.Println(Recover from r : , r) } }() defer func() { fmt.Println(33333) }() fmt.Println(111 Helloworld) panic(Panic 1!) //使用panic抛出异常后, 将立即停止当前函数的执行并运行所有被defer的函数然后将panic抛向上一层, 直至程序crash //但是也可以使用被defer的recover函数来捕获异常阻止程序的崩溃recover只有被defer后才是有意义的。 panic(Panic 2!) //panic1之后的panic2没有任何机会会被执行, panic2之后的任何代码更没有任何机会被执行 fmt.Println(222 Helloworld)} 输出为: 111 Helloworld33333Recover from r : Panic 1!2222211111333 Helloworld 对于goroutine中的panic,协程外面的recover是无法恢复的goroutine中的recover,同样无法恢复协程外的panic 但协程中的recover可以恢复协程中的panic package mainimport ( fmt time)func main() { go func() { defer func() { if err : recover(); err ! nil { fmt.Println(recover err:, err) } }() panic(里面出错了) }() //panic(外面出错了) time.Sleep(1 * time.Second)} 输出为 recover err 里面出错了 主方法中的recover,也可以恢复子方法里的panic 但如果go subfunc(),则同样无法捕获subfunc中的异常 func main() { fmt.Println(123) defer fmt.Println(999) defer func() { if err : recover(); err ! nil { fmt.Println(恢复异常:,err) } }() subfunc()}func subfunc() { defer fmt.Println(888) panic(出现了bug) defer fmt.Println(456)} 结果为: 123888恢复异常: 出现了bug999 因为panic发生的时候panic函数后面的语句都不会执行了所以recover函数不能放在panic语句后面执行而要放在defer函数中执行。 使用 panic 抛出异常后函数执行将从调用 panic 的地方停止如果函数内有 defer 调用则执行 defer 后边的函数调用如果 defer 调用的函数中没有捕获异常信息这个异常会沿着函数调用栈往上传递直到 main 函数仍然没有捕获异常将会导致程序异常退出 如何区别使用 panic 和 error 两种方式 惯例是导致关键流程出现不可修复性错误的使用 panic 其他使用 error 。 panic 和 recover 的组合有如下特性 有 panic 没 recover 程序宕机。 有 panic 也有 recover 程序不会宕机执行完对应的 defer 后从宕机点退出当前函数后继续执行。 recover能捕获所有错误吗 不能 Go 有哪些无法恢复的致命场景 像 并发读写 map fatal error: concurrent map read and map write 堆栈内存耗尽(如递归) runtime: goroutine stack exceeds 1000000000-byte limitruntime: sp0xc0200e1bf0 stack[0xc0200e0000, 0xc0400e0000]fatal error: stack overflow 将 nil 函数作为 goroutine 启动 fatal error: go of nil func value goroutines 死锁 fatal error: all goroutines are asleep - deadlock! 线程超过设置的最大限制 fatal error: thread exhaustion 超出可用内存 fatal error: runtime: out of memory 总之 都会报fatal error:xxxxxxxx 拓展参考: golang panic和recover 实现原理[1] Go 学习笔记19— 函数05[如何触发 panic、触发 panic 延迟执行、panic 和 recover 的关系][2] Go 语言踩坑记——panic 与 recover[3] 参考资料 [1] golang panic和recover 实现原理: https://blog.csdn.net/u010853261/article/details/102761955 [2] Go 学习笔记19— 函数05[如何触发 panic、触发 panic 延迟执行、panic 和 recover 的关系]: https://blog.csdn.net/wohu1104/article/details/105571916 [3] Go 语言踩坑记——panic 与 recover: https://xiaomi-info.github.io/2020/01/20/go-trample-panic-recover/ 本文由 mdnice 多平台发布