返回顶部
分享到

golang panic 函数用法介绍

Golang 来源:互联网 作者:佚名 发布时间:2025-03-02 08:27:39 人浏览
摘要

在 Go 语言中,panic和recover是用于处理运行时异常的关键字。以下是它们的用法总结和示例: 1. panic 的作用 触发条件:当程序遇到无法恢复的严重错误时(如不可预料的逻辑错误、依赖项缺失

在 Go 语言中,panic 和 recover 是用于处理运行时异常的关键字。以下是它们的用法总结和示例:

1. panic 的作用

  • 触发条件:当程序遇到无法恢复的严重错误时(如不可预料的逻辑错误、依赖项缺失等),panic 会终止当前函数的执行,并逐层向上触发 defer,最后若未被 recover 捕获,程序会崩溃。
  • 适用场景:
    • 初始化阶段的关键资源缺失(如配置文件、数据库连接)。
    • 代码逻辑中出现不可恢复的异常(如断言失败)。

2. 基本用法

1

2

3

4

5

6

7

8

9

10

11

12

package main

import \"fmt\"

func main() {

    defer func() {

        if r := recover(); r != nil {

            fmt.Println(\"Recovered from panic:\", r)

        }

    }()

    fmt.Println(\"Start\")

    panic(\"something bad happened\") // 触发 panic

    fmt.Println(\"End\") // 不会执行

}

输出:

Start
Recovered from panic: something bad happened

3. recover 的使用规则

  • 必须与 defer 结合:recover 只能在 defer 函数中生效。
  • 仅在当前 goroutine 有效:无法捕获其他 goroutine 的 panic。

1

2

3

4

5

6

7

8

9

10

11

12

func mayPanic() {

    panic(\"a problem occurred\")

}

func main() {

    defer func() {

        if r := recover(); r != nil {

            fmt.Println(\"Recovered. Error:\", r)

        }

    }()

    mayPanic() // 触发 panic

    fmt.Println(\"After mayPanic()\") // 不会执行

}

4. 错误处理建议

  • 优先返回 error:常规错误应通过多返回值(如 error 类型)处理。
  • 谨慎使用 panic:仅在严重错误或不可恢复场景下使用(如程序启动失败)。
  • 在关键位置 recover:例如在 goroutine 的入口或 HTTP 请求处理器中,防止程序崩溃。

Web 服务器示例:

1

2

3

4

5

6

7

8

func handleRequest() {

    defer func() {

        if err := recover(); err != nil {

            log.Println(\"Request failed:\", err)

        }

    }()

    // 处理请求逻辑(可能触发 panic)

}

5. 常见错误场景

  • 未捕获的 panic:若未在 defer 中调用 recover,程序会崩溃。
  • 跨 goroutine panic:每个 goroutine 需独立处理自己的 panic。

总结

  • panic:用于终止程序执行并传递错误信息。
  • recover:在 defer 中捕获 panic,恢复程序流程。
  • 最佳实践:优先使用错误返回值,仅在必要时结合 panic 和 recover。

通过合理使用这两个关键字,可以提升程序的健壮性,避免因未处理异常导致的崩溃。


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • golang之 wire 库的使用介绍
    1. 写在最前面 之前 review 其他人的代码的时候,看到了关于 wire 库的使用。但当时主要是分析逻辑上的问题,没怎么太学习 wire 库的用法,
  • golang panic 函数用法介绍
    在 Go 语言中,panic和recover是用于处理运行时异常的关键字。以下是它们的用法总结和示例: 1. panic 的作用 触发条件:当程序遇到无法恢复
  • Go中sync.Once源码的深度介绍
    概念 sync.Once是Go语言标准库中的一个同步原语,用于确保某个操作只执行一次。它在多线程环境中非常有用,尤其是在需要初始化共享资源
  • 基于Go语言实现一个压测工具

    基于Go语言实现一个压测工具
    整体架构 整体系统架构比较简单 通用数据处理模块 Http请求响应数据处理 本项目支持http协议、websocket协议、grpc协议、Remote Authentication Di
  • golang1.23版本之前Timer Reset方法无法正确使用

    golang1.23版本之前Timer Reset方法无法正确使用
    golang1.23 之前 Reset ?到底有什么问题 在golang 的 time.Reset 文档中有这么一句话,为了防止文档更新而导致内容变动,这里粘贴出来: Before Go 1
  • 从源码解析golang Timer定时器体系
    Timer、Ticker使用及其注意事项 在刚开始学习golang语言的时候就听说Timer、Ticker的使用要尤其注意,很容易出现问题,这次就来一探究竟。 本
  • 如何修改Go结构体的私有字段
    文章正文 在 Go 语言中,结构体字段的访问权限是由字段名的首字母决定的:首字母大写表示公共字段(public),首字母小写表示私有字段(
  • Golang实现超时机制读取文件的方法
    协程与通道 协程(Goroutine)是轻量级线程,可实现函数或方法与主程序流并行执行。使用go关键字:go func(){}。通道是协程直接的通讯管道,
  • golang如何解决go get命令无响应问题

    golang如何解决go get命令无响应问题
    golang go get命令无响应问题 操作 1 go get -v github.com/golang/net 现象 go get github.com/golang/net: module github.com/golang/net: Get https://proxy.golang.org/github.co
  • Go语言中字符串赋值中的问题与解决方法
    字符串的拼接方式 使用+号 使用+号拼接字符串的方式,每次拼接都会创建一个新的字符串,然后将原来的字符串复制到新的字符串中,这样
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计