go获取正在运行的函数并及时捕获panic

embedded/2024/11/14 20:08:20/

Go 语言中,panic 是一种运行时错误,它会导致当前 goroutine 立即停止执行,并开始逐层向上返回,直到被 recover 捕获或者程序崩溃。panic 通常用于异常情况,比如程序遇到了无法恢复的错误。

捕获 panic 的主要作用包括:

防止程序崩溃:

通过使用 defer 和 recover,可以在发生 panic 时防止程序完全崩溃,允许程序优雅地处理错误。
错误恢复:

在某些情况下,即使发生了 panic,程序可能仍然可以恢复到安全状态并继续执行。
资源清理:

当 panic 发生时,defer 语句注册的函数仍然会被执行,这允许程序进行必要的清理工作,如关闭文件、释放资源等。
日志记录:

捕获 panic 可以记录详细的错误信息和堆栈跟踪,这对于调试和监控程序运行时的错误非常有用。

需要注意的是,panic 并不是用于正常错误处理流程的手段。在正常的业务逻辑中,应该使用错误返回值来处理错误情况。panic 应该仅用于那些极端的、无法通过常规错误处理恢复的情况。滥用 panic 和 recover 可能会导致程序逻辑难以理解和维护。因此,在使用 panic 和 recover 时,应该谨慎考虑是否真的需要它们,以及它们在程序中的作用。

用反射发现正在运行的函数:

func RunFuncName() string {pc := make([]uintptr, 1)runtime.Callers(2, pc)f := runtime.FuncForPC(pc[0])fname := f.Name()fnameSplits := strings.Split(fname, ".")return fnameSplits[len(fnameSplits)-1]
}

捕获panic:

	defer func(funcName string) {if errs := recover(); errs != nil {err := util.DealPanicInfo(funcName, errs)log.Error(err)}}(util.RunFuncName())func DealPanicInfo(funcName string, errs interface{}) (err error) {if errs != nil {err = fmt.Errorf("%s funcName %s panic err:%v \npanic details: %s", FatalError,funcName, errs, string(debug.Stack()))return err}return nil
}

http://www.ppmy.cn/embedded/58237.html

相关文章

Unity3D 资源管理YooAsset原理分析与详解

引言 Unity3D 是一款广泛应用于游戏开发、虚拟现实(VR)、增强现实(AR)等领域的强大游戏开发引擎。在开发过程中,资源管理是一项至关重要的任务,它直接影响到游戏的性能和用户体验。YooAsset 是一个基于 Un…

软件运行次数

题目: 实现一个验证程序运行次数的小程序,要求如下: 当程序运行超过3次时给出提示:本软件只能免费使用3次,欢迎您注册会员后继续使用~程序运行演示如下: 第一次运行控制台输出:欢迎…

VirtualBox 安装 Ubuntu Server24.04

环境: ubuntu-2404-server、virtualbox 7.0.18 新建虚拟机 分配 CPU 核心和内存(根据自己电脑实际硬件配置选择) 分配磁盘空间(根据自己硬盘实际情况和需求分配即可) 设置网卡,网卡1 负责上网&#xff0c…

找不到msvcr120.dll无法继续执行代码的原因分析及解决方法

我们可以使用一种科学的方法解决msvcr120.dll丢失的问题。这是由于日常使用电脑时的不当操作,可能会导致一些dll文件的丢失。对于这种情况,我们可以谨慎地修复来解决。 一、首先让我们了解msvcr120.dll是什么及重要性 msvcr120.dll 是微软公司开发的Vis…

Apache Seata应用侧启动过程剖析——RM TM如何与TC建立连接

本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 Apache Seata应用侧启动过程剖析——RM & TM如何与TC建立连接 前言 看过官网 README 的第…

【云原生】Kubernetes之持久化

Kubernetes 持久化存储 文章目录 Kubernetes 持久化存储一、为什么要做持久化存储二、都有哪些存储2.1、emptyDir2.1.1、什么是emptyDir2.1.2、emptyDir作用2.1.3、emptyDir的应用场景2.1.4、emptyDir优缺点2.1.5、emptyDir的使用方式 2.2、hostPath2.2.1、什么是hostPath2.2.2…

基于DPU的云原生计算资源共池管理解决方案

1. 方案背景和挑战 在传统的云环境中,通常存在着不同的技术栈,支撑多样化的计算服务,具体如下: ① OpenStack环境与虚拟化云主机及裸金属服务 OpenStack是一个开源的云计算管理平台项目,它提供了部署和管理大规模计…

【c++刷题笔记-动态规划】day32: 509. 斐波那契数 、 70. 爬楼梯 、 746. 使用最小花费爬楼梯

509. 斐波那契数 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int fib(int n) {if(n0){return 0;}vector<int>dp(n1);dp[0]0;dp[1]1;for(int i2;i<n;i){dp[i]dp[i-1]dp[i-2];}return dp[n];} }; 70. 爬楼梯 - 力扣&#xff08;LeetCode&#x…