【Go】panic、recover 区分

简介: 【Go】panic、recover 区分

1.panic

在goroutine当中一旦触发panic(宕机),将从
panic处终止程序进行,同时调用该panic调用栈上的所有defer,执行defer中若无recover,则exit异常退出

package main

import "fmt"

func main() {
    fmt.Println("main start")
    go test()
    fmt.Println("main end")
}
func test() {
    defer fmt.Println("test")
    panic("test panic")
}

2.recover

在panic调用栈defer,若调用panic(包括主动和被动)的函数栈上有recover,则截获该panic,程序继续从panic处执行,运行完毕后,exit正常退出,否则exit异常退出

package main

import (
    "fmt"
)

func main() {
    go test()
}
func test() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("recovery")
        }
    }()
    panic("test panic")
}

3.注意事项

  • 对于go1.6以上版本,如果出现 并发map读写 程序会直接以 fatal error 崩溃,即使在同一个协程内有recover()也不能恢复
  • 对于panic显示的函数堆栈调用关系,debug.PrintStack()也可以做到
  • 一般来说,不建议在业务代码中使用 panic
  • 如果当前 goroutine 中所有 deferred 函数都不包含 recover 就会造成整个程序崩溃
  • 当程序启动阶段发生不可逆转的错误时,可以在 init 或 main 函数中使用 panic

4.总结

  • panic 用于真正异常的情况

  • error 尽可能提供简明的上下文信息,方便定位问题

  • recover 生效范围,在当前 goroutine 的被 defer 的函数中生效

目录
相关文章
|
2月前
|
Go
实验深度理解Go中try...catch...的panic、defer、recover用法
文章通过实验代码演示了Go语言中如何使用panic、defer和recover函数来模拟try...catch...的异常处理机制,并详细解释了每个函数的作用和在异常处理中的使用场景。
28 0
|
5月前
|
Go 开发者
Golang深入浅出之-Go语言 defer、panic、recover:异常处理机制
Go语言中的`defer`、`panic`和`recover`提供了一套独特的异常处理方式。`defer`用于延迟函数调用,在返回前执行,常用于资源释放。它遵循后进先出原则。`panic`触发运行时错误,中断函数执行,直到遇到`recover`或程序结束。`recover`在`defer`中捕获`panic`,恢复程序执行。注意避免滥用`defer`影响性能,不应对可处理错误随意使用`panic`,且`recover`不能跨goroutine捕获panic。理解并恰当使用这些机制能提高代码健壮性和稳定性。
111 2
|
5月前
|
Go
Go语言中的异常处理:理解panic与recover
【2月更文挑战第7天】Go语言虽然以简洁和直接错误处理机制而著称,但它也提供了`panic`和`recover`这两个内置函数来处理程序中的异常情况。本文将深入探讨Go语言中的异常处理机制,包括`panic`和`recover`的使用场景、原理以及最佳实践,帮助读者更好地理解如何在Go中处理异常情况。
|
5月前
|
网络协议 BI Go
Go-异常处理(defer recover panic)
Go-异常处理(defer recover panic)
69 0
|
编译器 Go
Go学习笔记-defer、panic、recover分析
Go学习笔记-defer、panic、recover分析
81 1
Go学习笔记-defer、panic、recover分析
|
10月前
|
存储 Cloud Native Go
Go 语言中 panic 和 recover 搭配使用
Go 语言中 panic 和 recover 搭配使用
|
Go 数据库
Go语言学习之 panic 和 recover
Go语言学习之 panic 和 recover
35 0
|
1天前
|
Java 编译器 Go
探索Go语言的性能优化技巧
在本文中,我们将深入探讨Go语言的底层机制,以及如何通过代码层面的优化来提升程序性能。我们将讨论内存管理、并发控制以及编译器优化等关键领域,为你提供一系列实用的技巧和最佳实践。
|
1天前
|
Cloud Native Go API
Go语言在微服务架构中的创新应用与实践
本文深入探讨了Go语言在构建高效、可扩展的微服务架构中的应用。Go语言以其轻量级协程(goroutine)和强大的并发处理能力,成为微服务开发的首选语言之一。通过实际案例分析,本文展示了如何利用Go语言的特性优化微服务的设计与实现,提高系统的响应速度和稳定性。文章还讨论了Go语言在微服务生态中的角色,以及面临的挑战和未来发展趋势。
|
1天前
|
安全 Go 调度
探索Go语言的并发模式:协程与通道的协同作用
Go语言以其并发能力闻名于世,而协程(goroutine)和通道(channel)是实现并发的两大利器。本文将深入了解Go语言中协程的轻量级特性,探讨如何利用通道进行协程间的安全通信,并通过实际案例演示如何将这两者结合起来,构建高效且可靠的并发系统。