Go语言异常处理

go语言的异常处理机制 errNO int// 定义错误方法如果我们直接打印一个error对象,实际上调用的是error.Error()Go语言异常机制是一种非常重要的特性,它可以帮助我们诊断程序中的错误,并提供一种优雅的方式来处理这些错误。在使用异常时,需要注意不要滥用异常,只在必要的时候抛出异常和捕获异常,提供足够的上下文信息,并且不要忽略任何异常。如果合理使用异常,可以让我们的代码更加健壮、清晰和可读。 阅读详情

1.err接口使用

package main

import "fmt"
import "errors"

func main() {
	//方法一 使用fmt包
	var err1 = fmt.Errorf("%s", "this is normal err1")
	fmt.Println("err1 = ", err1)
	err2 := fmt.Errorf("%s", "this is normal err2")
	fmt.Println("err2 = ", err2)
	//方法二 使用errors包
	err3 := errors.New("this is normal err3")
	fmt.Println("err3 = ", err3)
}

输出:

2.err接口的应用

package main

import "fmt"
import "errors"

func Mydiv(a, b int) (result int, err error) {
	err = nil
	if b == 0 {
		err = errors.New("分母不能为0")
	} else {
		result = a / b
	}
	return
}

func main() {
	result, err := Mydiv(2, 0)
	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Println("result = ", result)
	}
}

输出:

3.panic异常

       当遇到不可恢复的错误状态时,如数组访问越界、空指针引用等,这些运行时错误会引起panic异常。当某些不应该发生的场景发生时,我们就应该调用panic.一般而言,当panic异常发生时,程序会中断运行,并立即执行该goroutine(可以先理解成线程),在执行中被延迟的函数(defer机制)。随后,程序崩溃并输出日志信息。日志信息包括panic value和函数调用的堆栈跟踪信息。

       不是所有的panic异常都来自运行时,直接调用内置的panic函数也会引发panic异常;panic函数接受任何值作为参数。

【1】显式调用panic异常

package main

import "fmt"

func testa() {
	fmt.Println("aaa")
}

func testb() {
	//fmt.Println("bbb")
	//显示调用panic函数,导致程序中断
	panic("this is a panic test")
}
func testc() {
	fmt.Println("ccc")
}

func main() {
	testa()
	testb()
	testc()
}

输出:

可以看到testa执行完后,在执行testb的时候程序中断,并提示panic: this is a panic test

【2】数组越界引起panic

package main

import "fmt"

func testa() {
	fmt.Println("aaa")
}

func testb(x int) {
	var a [10]int
	a[x] = 666 //当x为20时,导致数组越界,系统自动调用panic,导致程序崩溃
}
func testc() {
	fmt.Println("ccc")
}

func main() {
	testa()
	testb(20)
	testc()
}

输出:

4.recover

       运行时panic异常一旦被引用就会导致程序崩溃。这当然不是我们愿意看到的,因为谁也不能保证程序不会发生任何运行时错误。

       不过,Go语言为我们提供了专用于“拦截”运行时panic的内建函数—recover。他可以是当前的程序从运行时panic的状态中恢复并重新获得流程控制权。

注意:recover只有在defer调用的函数中有效。

       如果调用了内置函数recover,并且定义该defer语句的函数发生了panic异常,recover会使程序从panic中恢复,并返回panic value。导致panic异常的函数不会继续运行,但能正常返回。在未发生panic时调用recover,recover会返回nil。    

应用:

package main

import "fmt"

func testa() {
	fmt.Println("aaa")
}

func testb(x int) {
	//设置recover
	defer func() {
		//recover() 可以打印panic的错误信息
		if err := recover(); err != nil {
			fmt.Println(err)
		}
	}()
	var a [10]int
	a[x] = 666
}
func testc() {
	fmt.Println("ccc")
}

func main() {
	testa()
	testb(2)
	testc()
	testb(20)
}

输出:

聊聊Go语言的异常处理机制 golang的内置方法,能够改变程序的控制流。当函数调用了panic,函数会停止运行,但是defer函数会运行,程序会在当前panic的goroutine全部退栈以后crash。关于Golang panic的机制,我们从使用层面入手,一直到了Golang源码的处理逻辑,后续又稍微了解了一下从系统层到golang的一个配合。基本上回答了开始提的4个问题,对整个链路应该有了一个大体的认识。 阅读详情

相关推荐

Go 语言的异常处理

ERROR 是什么 对于一个 Go 语言程序员,你一定写过这样的代码。 if err != nil { doSomething() } 复制代码 这里的 err 便是我们今天要讨论的主角,为了解释它是什么这个问题,我们不妨先从设计者的角度出发,看一看标准库里的 errors 包是如何设计的。 // because the former will succeed if err wraps an *fs.PathError. package errors // New returns an

weixin_64314555的博客 1819

Go invalid memory address or nil pointer dereference错误 空指针问题

Go 指针声明后赋值,出现 panic: runtime error: invalid memory address or nil pointer dereference,这种是内存地址错误。首先我们要了解指针,指针地址。

lxw1844912514的博客 9489

Go语言的 的异常处理(Exception Handling)核心知识

提供丰富的错误信息,例如字段和上下文,以方便调试。可以使用errors.Is和errors.As等函数来检查错误的类型。

2401_90035650的博客 948

golang 空指针

前面用用习惯了golang的自动初始化的功能,所以编程的时候会直接声明指针,直接拿来用的情况,就像下面的情况 type N struct { Name string `json:"name"` Data UpdateCommentRequestData `json:"data"` } func main() { var name *N name.Name = "bobobobob" }

markcheney的博客 8257

常见的错误与解决方法(Golang)

在编写代码时,我们应该养成良好的代码习惯,避免出现这些错误。空指针引用错误是指在程序中使用了一个空(nil)指针,导致程序崩溃。在Go语言中,空指针引用错误是一种常见的错误,尤其是在使用指针类型时。在使用完资源后,应该及时释放资源。类型不匹配错误是指在程序中使用了不兼容的类型进行赋值或者比较操作,导致编译错误或者产生错误的结果。资源泄漏错误是指在程序中未正确释放占用的资源,导致内存或者其他系统资源无法正常回收的错误。死锁错误是指在并发程序中,多个线程相互等待对方释放资源,导致程序无法继续执行的错误。

HmoaAmp的博客 353

GPT大模型在数学建模中的实战应用:从思路启发到代码生成

数学建模是将现实问题抽象为数学问题并求解的核心方法,其关键在于通过合理的假设与简化,构建可计算的数学模型。传统建模依赖MATLAB等工具进行推演试错,而大语言模型的出现革新了这一范式。GPT等模型通过理解自然语言、辅助逻辑推理与代码生成,能有效提升建模效率与质量,在问题解析、模型构建、算法实现等环节提供关键支持。本文聚焦GPT在数学建模中的具体应用,涵盖赛题解读、模型推导、代码生成与结果分析,并结合实战案例,探讨如何将其作为“副驾驶”融入建模全流程,实现人机协同的智能化建模。

weixin_29061465的博客 324

【Golang】go语言异常处理快速学习

Go语言常见的异常处理知识大全,快速入门学习,形成整体知识架构,在实际中应用分析go语言异常处理的机制

2301_79819426的博客 1532

SCHUNK SVH五指灵巧手 | 熵洛智能

雄克仿真五指机械手产品系列可以如人手操作那般完美地完成抓取操作。电子装置完全集成于腕关节中,使五指机械手几乎可以完成所有的人体手部动作。凭借带有9个驱动器的运动指骨,机械手可高精度地 执行多种抓取操作。富有弹性的抓取表面确保了对物体的可靠抓取。除了开启抓取和操作任务的全新领域之外,雄克还为在五指机械手的手势基础上进行人与机器人的交流开创了无限可能。编辑切换为居中添加图片注释,不超过 140 字(可选)产品特点:机械手有左手或右手两种版本适合移动应用耗能低,使用 24 V DC 在腕关节处完整集成了控制、调节

ShannonTech的博客 1332

视频教程-桫哥-GOlang-07异常处理-Go语言

桫哥-GOlang-07异常处理 多年互联网从业经验; 有丰富的的企业网站、...

weixin_32214095的博客 226

西门子机床数据采集实战:从828D到840DSL的CNC设备联网与实时监控

本文深入探讨了西门子机床数据采集的实战方案,重点解析了从828D到840DSL等CNC设备如何实现免授权、低成本联网与实时监控。文章通过对比不同型号系统的数据接口差异,提供了详细的配置步骤、核心数据点清单以及避坑指南,旨在帮助工厂技术人员经济高效地挖掘机床数据价值,提升生产管理效率。

weixin_29181861的博客 1331

(SCADA)监控与数据采集系统

SCADA应用于监控和采集数据来控制工业过程软件。它通过收集和传输实时数据,帮助操作员监视和控制各种设备和过程。

软件技术的专栏 4544

Go语言的异常处理机制

defer(延迟执行):语句用于延迟执行一个函数调用,直到包含该defer语句的函数返回时才执行。在资源释放、日志记录等场景中尤为有用如果有多个defer语句,它们按后进先出(LIFO)顺序(先声明的后执行)defer语句的执行时机在函数返回之前,即使它位于return之后执行。panic(恐慌):用于触发一个运行时的错误,它可以在程序的任何地方引发,一旦触发,他会立刻停止当前函数的执行,并且开始回溯调用栈,直到遇到recover或者程序终止。recover。

2303_79710813的博客 1373

024、反激变换器的短路保护设计

本文详细探讨了反激变换器短路保护的设计要点与实践经验。作者通过实际案例分析了短路时反激拓扑的电流特性,指出初级峰值电流限制是最基础的保护手段,但需配合打嗝模式使用。文章重点剖析了打嗝模式设计的三个关键陷阱:频率设定、退出条件和软启动衔接。同时强调次级侧辅助保护、变压器参数优化、环路响应协调的重要性,并比较了自恢复与锁死方案的适用场景。最后提出实测验证的四个关键点和设计经验:不盲信芯片手册、保护电路独立设计、充分留有余量、进行破坏性测试。全文以工程实践为导向,为反激电源的可靠短路保护提供了系统性解决方案。

Jack010169的博客 242

Golang深入浅出之-Go语言 defer、panic、recover:异常处理机制

Go语言通过deferpanic和recover三个关键字构建了一种独特的异常处理机制。它们协同工作,使得Go程序能够优雅地处理运行时错误和异常情况。本文将深入浅出地解析这三个关键字的用法、特点以及常见问题与易错点,并通过代码示例进行演示。

zevjay的博客 1100

【项目实战】DevOps制品管理之JFrog Artifactory介绍

JFrog Artifactory是一款领先的二进制软件制品仓库管理工具,由JFrog公司开发。

奶爸的编程之路,也就一周冷个三天 1355

【第1章>第5节】SOM自组织映射网络的理论学习与MATLAB仿真

自组织映射网络(Self-Organizing Map,SOM)是一种无监督学习的人工神经网络,由芬兰学者Teuvo Kohonen于1981年提出,也被称为Kohonen网络。它的主要功能是将高维输入数据映射到低维(通常是二维)的离散网格上,同时保持输入数据的拓扑结构,即相邻的输入数据在映射后的网格上也相邻。

FPGA/MATLAB学习教程/源码/项目合作开发 403

【Hello Go】Go语言异常处理

Go语言异常处理

小萌新的博客 521

【AUTOSAR-E2E】-1.4-详述E2E Transformer解决方案

共13页精讲 目录 1“Data Transformation”介绍 1.1 基于SOME/IP Transformer 1.2 基于COM Based Transformer 2 ComXf(COM Based Transformer)介绍 2.1 ComXf(COM Based Transformer)功能规范 2.2 ComXf(COM Based Transformer)提供的服务 2.3 配置注意事项 3 E2EXf(E2E Transformer)介绍 3.1 E2EX...

「汽车电子助手」的博客 4700

Go语言——随机数 异常处理

Go语言——随机数 异常处理 本文是学校选修课笔记 author: fengclchn@outlook.com 1.随机数 // rand project main.go package main import ( "fmt" "math/rand" //随机数 "time" //时间 ) func main() { rand.Seed(time.Now().Unix()) //秒级unix时间 // n := rand.Intn(10) //十以内的随机整

SPECIAL8654237的博客 981

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【30天熟悉Go语言】10 Go异常处理机制

Go的异常处理分三块:通过defer关键字 + recover()函数捕获异常、通过errors包下的New()函数自定义异常、通过panic()函数中断程序执行。

健身变秃,coding变强 1426

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

go语言 异常处理

异常处理 Go语言追求简洁优雅,所以,Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱。因为开发者很容易滥用异常,甚至一个小小的错误都抛出一个异常。在Go语言中,使用多值返回来返回错误。不要用异常代替错误,更不要用来控制流程。在极个别的情况下,也就是说,遇到真正的异常的情况下(比如除数为0了)。才使用Go中引入的Exception处理:defer, panic, recover。 1 error Go语言内置了一

xqldyssssyd的博客 654

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Go 语言异常处理

Go 语言使用panic和recover语句来实现异常处理机制。使用panic语句可以抛出一个异常,而使用recover语句可以捕获该异常并恢复程序的正常执行流程。在编写程序时,应尽量避免使用 panic 来处理错误,而应该使用错误处理机制来处理程序中的错误。这样可以使程序更加健壮、可读、可维护。

GeeCode的博客 579

Python与go语言的异常处理

断言异常,当 assert 关键字后的条件为假时,程序运行会停止并抛出 AssertionError 异常,常用于测试上,如下图。名称错误,在被访问的标识符未在本地或全局范围内定义时引发,如下图。字典中不存在所需要的key而引发错误,如下图。参数的值不适合而引发错误,如下图。不管有没有异常,不管异常有没有捕获,都会执行。脚本缩进异常时引发,如下图。Python中遇到错误异常,程序就终止了。对象属性错误,如下图。内置包errors--产生错误对象。异常发生时不终止程序,做特殊处理。

m0_69298614的博客 516

go语言异常处理

go语言异常处理

p15097962069的博客 95
上一篇: Go语言面向对象编程(三)接口
下一篇: Go语言编程之字符串操作
random_w
博客等级 码龄9年 130粉丝 168原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值