当前位置: 首页 > news >正文

go 错误 异常

自定义错误

 Go语言中  错误使用内建的 error 类型表示, error类型是一个接口类型:定义如下:

 error 有一个 Error() 的方法‘所有实现该接口的类型 都可以当做一个错误的类型;Error()方法输入具体错误描述,在打印错误时 可以调用 Error() 来输出错误

type error struct {Error() string
}

对于简单的数据类型,一个 println 就可以了,

但是对于复杂类型 我们可以通过继承接口的方式 灵活的方式进行:

例如一个计算面积的函数:需要判断输入是否合法:比如输入负数则报错!

  

方式1:

//计算面积
//输入两个数 返回 面积和错误
func area(a, b int) (int, error) {if a < 0 || b < 0 {//第一种//return 0, errors.New("计算长度 不能为负数")//第二种return 0, fmt.Errorf("计算长度 不能为负数; 长度%d,宽度%d 不能小于0", a, b)//return 0, &areaError{"计算长度 不能为负数", a, b}}return a * b, nil
}//调用:a := 20
b := -56r, err := area(a, b)
if err != nil {fmt.Println(err)return
}
fmt.Println("area:", r)输入:
计算长度 不能为负数计算长度 不能为负数; 长度20,宽度-56 不能小于0

  

方式2:

//定义错误结构体
type areaError struct {err    string //错误描述length int    //宽度width  int    //长度
}
//实现一个接口
func (e *areaError) Error() string {//return fmt.Sprintf("length %d, width %d", e.length, e.width)return e.err
}//求面积函数
func area(a, b int) (int, error) {if a < 0 || b < 0 {return 0, &areaError{"计算长度 不能为负数", a, b}}return a * b, nil
}//调用:
a := 20
b := -56r, err := area(a, b)
//写法1
if err != nil {if err, ok := err.(*areaError); ok {fmt.Printf("length %d or width %d is less than zero\n", err.length, err.width)fmt.Println(err)return}fmt.Println(err)return
}
fmt.Println("area:", r)输出:
length 20 or width -56 is less than zero
计算长度 不能为负数

方式3:

//定义结构体和 函数
type areaError struct {err    string //错误描述length int    //宽度width  int    //长度
}func (e *areaError) Error() string {//return fmt.Sprintf("length %d, width %d", e.length, e.width)return e.err
}func (e *areaError) widthNegative() bool {return e.width < 0
}func (e *areaError) lengthNegative() bool {return e.length < 0
}//面积函数的定义
func area(length, width int) (int, error) {err := ""if length < 0 {err += "length is negative"}if width < 0 {err += "width is negative"}if err != "" {return 0, &areaError{err: err, length: length, width: width}}return length * width, nil
}//调用:
a := 20
b := -56r, err := area(a, b)
if err != nil {if err, ok := err.(*areaError); ok {if err.lengthNegative() {fmt.Println("Length is error :", err.length)}if err.widthNegative() {fmt.Println("width is error :", err.width)}fmt.Printf("length:%d, width:%d\n", err.length, err.width)return}fmt.Println(err)
}
fmt.Println("area:", r)//输出:
width is error : -56
length:20, width:-56

异常

异常和错误 是两个不同的概念,容易混淆:

  • 错误是指:在有可能出现问题的地方,出现了问题
  • 异常是指:在不应该出现问题的地方,出现了问题

 

go 中的处理异常的主要有两种

  1. panic会导致程序会终止,在编写程序的时候 尽量使用错误; 只有在程序不能继续进行下去的时候在使用  panic,在发生 panic 的时候使用 recover 防止程序终止

    // 会导致程序会终止,在编写程序的时候 尽量使用 错误; 只有在程序不能继续进行下去的时候在使用: panic, recover
    func myTest() {defer fmt.Println("myTest defer")panic("myTest panic")
    }func main() {defer fmt.Println("main defer")myTest()fmt.Println("main ...")
    }输出:带错误码的异常中断,并且程序没有执行完整;   没有打印 fmt.Println("main ...")myTest defer
    main defer
    panic: myTest panicgoroutine 1 [running]:
    main.myTest()D:/awesomeProject/grammar/chapter08/main.go:18 +0x73
    main.main()D:/awesomeProject/grammar/chapter08/main.go:7 +0x70Process finished with the exit code 2

  2. recover recover 类似与其他语音 try catch但是它只有在 相同的协程中才能 recover到异常,继续执行代码 不至于奔溃

    // 在发生 panic 的时候, recover 防止程序终止
    // recover 类似与  try catch 只有在相同的协程中才能 recover到异常,继续执行代码 不至于奔溃
    func outOfArray(x int) {defer func() {if err := recover(); err != nil {fmt.Println(err)}}()var array [5]intarray[x] = 1
    }func main() {outOfArray(6)fmt.Println("main ...")}输出: 带错误输出,并且程序继续往下执行 (执行完整) 输出 fmt.Println("main ...")runtime error: index out of range [6] with length 5
    main ...Process finished with the exit code 0
    

相关文章:

go 错误 异常

自定义错误 Go语言中 错误使用内建的 error 类型表示&#xff0c; error类型是一个接口类型&#xff1a;定义如下&#xff1a; error 有一个 Error() 的方法‘所有实现该接口的类型 都可以当做一个错误的类型&#xff1b;Error()方法输入具体错误描述&#xff0c;在打印错误时…...

智慧加油站卸油作业行为分析算法 opencv

智慧加油站卸油作业行为分析系统通过opencvpython网络模型技术&#xff0c;智慧加油站卸油作业行为分析算法实现对卸油作业过程的实时监测。当现场出现卸油作业时人员离岗&#xff0c;打电话人员抽烟等违规行为&#xff0c;灭火器未正确摆放&#xff0c;明火和烟雾等异常状态&a…...

LiangGaRy-学习笔记-Day22

1、shell工具-tput 这个是tput bash工具 具体的操作如下&#xff1a; tput clear&#xff1a;清屏tput cup Y X 第Y行&#xff0c;第X列的位置 tput bold&#xff1a;字体加粗tput sgr0 &#xff1a; 重置命令tput setaf n n&#xff1a;代表数字0-7 0黑色1红色2绿色3黄色4蓝…...

数据库横表和竖表有什么区别

横表和竖表是描述数据库表结构的两种形式&#xff0c;它们之间的主要区别在于数据的组织方式和用途。 横表&#xff08;宽表&#xff09;&#xff1a; 横表是一种常见的表结构&#xff0c;其特点是每一行数据包含所有相关属性&#xff0c;字段通常作为列出现。横表中的每行代表…...

哈希表--day1--基本理论介绍

文章目录 哈希表哈希函数哈希碰撞拉链法线性探测法 常见的三种哈希函数数组setmap 总结 哈希表 Hash table是根据关键码的值来直接进行访问的数据结构。 其实直白来讲其实数组就是一张哈希表&#xff0c;不过其索引是十分简单的&#xff0c;我们通过0来访问num[0]&#xff0c…...

基于OpenMV的疲劳驾驶检测系统的设计

一、前言 借助平台将毕业设计记录下来&#xff0c;方便以后查看以及与各位大佬朋友们交流学习。如有问题可以私信哦。 本文主要从两个方面介绍毕业设计&#xff1a;硬件&#xff0c;软件&#xff08;算法&#xff09;。以及对最后的实验结果进行分析。感兴趣的朋友们可以评论区…...

chatgpt赋能python:使用Python来寻找两个列表不同元素的方法

使用Python来寻找两个列表不同元素的方法 在编写Python程序时&#xff0c;我们经常需要比较两个列表的元素&#xff0c;找出它们之间的不同之处。在搜索引擎优化&#xff08;SEO&#xff09;方面&#xff0c;这种比较对于找出两个网站内容的差异也非常有用。在这篇文章中&…...

简单学生管理系统

简单学生管理系统(Java)_封奚泽优的博客-CSDN博客https://blog.csdn.net/weixin_64066303/article/details/130667107?spm1001.2014.3001.5501 转载请注明出处&#xff0c;尊重作者劳动成果。 目录 前期准备&#xff1a; 数据库的连接&#xff1a; 用户账号类&#xff1a;…...

图像金字塔

​ 图像金字塔是由一幅图像的多个不同分辨率的子图构成的图像集合。是通过一个图像不断的降低采样率产生的&#xff0c;最小的图像可能仅仅有一个像素点。下图是一个图像金子塔的示例。从图中可以看到&#xff0c;图像金字塔是一系列以金字塔形状排列的、自底向上分辨率逐渐降低…...

Springboot整合Camunda工作流引擎实现审批流程实例

环境&#xff1a;Spingboot2.6.14 camunda-spring-boot-starter7.18.0 环境配置 依赖配置 <camunda.version>7.18.0</camunda.version> <dependency><groupId>org.camunda.bpm.springboot</groupId><artifactId>camunda-bpm-spring-boo…...

PHP设计模式21-工厂模式的讲解及应用

文章目录 前言基础知识简单工厂模式工厂方法模式抽象工厂模式 详解工厂模式普通的实现更加优雅的实现 总结 前言 本文已收录于PHP全栈系列专栏&#xff1a;PHP快速入门与实战 学会好设计模式&#xff0c;能够对我们的技术水平得到非常大的提升。同时也会让我们的代码写的非常…...

【玩转Docker小鲸鱼叭】理解Docker的核心概念

Docker核心概念 Docker有三大核心概念&#xff1a;镜像&#xff08;Image&#xff09;、容器&#xff08;Container&#xff09;、仓库&#xff08;Repository&#xff09; 1、镜像&#xff08;Image&#xff09; Docker镜像 是我们创建和运行Docker容器的基础&#xff0c;它…...

Eureka 心跳和服务续约源码探秘——图解、源码级解析

🍊 Java学习:社区快速通道 🍊 深入浅出RocketMQ设计思想:深入浅出RocketMQ设计思想 🍊 绝对不一样的职场干货:大厂最佳实践经验指南 📆 最近更新:2023年5月25日 🍊 点赞 👍 收藏 ⭐留言 📝 都是我最大的动力! 文章目录 分布式系统的心跳机制心跳机制的实…...

代码随想录二刷 530 二叉搜索树的最小绝对差 98. 验证二叉搜索树 700. 二叉搜索树中的搜索

530 二叉搜索树的最小绝对差 代码如下 func getMinimumDifference(root *TreeNode) int { var pre *TreeNode res : math.MaxInt var traverse func(root * TreeNode) traverse func(root * TreeNode) { if root nil { return } traverse(root.Left) …...

Docker安装——CentOS7.6(详细版)

ps:docker官网 在 CentOS 上安装 Docker 引擎 |官方文档 &#xff08;&#xff09; 一、确定版本&#xff08;必须是7以上版本&#xff09; cat /etc/redhat-release 二、卸载旧版本&#xff08;或者之前装过&#xff0c;没有安装过就不用管了&#xff09; &#xff08;root用…...

论信息系统项目的整体管理(范文)

论信息系统项目的整体管理&#xff08;范文&#xff09; 【摘要】 2016年10月&#xff0c;XX省卫生健康委启动了XX省分级转诊服务平台建设项目&#xff0c;我在项目中担任项目经理&#xff0c;负责项目的全面管理工作。该平台作为全省上下级医院转诊的信息化通道&#xff0c;…...

【音视频处理】音频编码AAC详解,低码率提高音质?

大家好&#xff0c;欢迎来到停止重构的频道。 本期我们介绍音频编码格式AAC。 AAC是音频最常用的编码格式之一&#xff0c;几乎所有的播放器都支持这个编码格式。 其他音频编码格式都是类似的&#xff0c;只是某些细节存在差别&#xff0c;如压缩算法、某些音频参数存在限制…...

逆函数学习

逆函数 给定关系 R ⊆ X Y R\subseteq X\times Y R⊆XY&#xff0c;颠倒 R R R的所有有序偶可以得到 R R R的逆关系 R ~ ⊆ Y X \tilde{R}\subseteq Y\times X R~⊆YX 但是对于函数 f : X → Y f:X\to Y f:X→Y而言&#xff0c;其逆关系 f ~ \tilde{f} f~​可能不是 Y Y Y到…...

代码审计——SSRF详解

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 漏洞描述02 审计要点03 漏洞特征04 漏洞案例05 修复方案 01 漏洞描述 服务端请求伪造攻击&#xff08;SSRF&#xff09;也成为跨站点端口攻击&#xff0c;是由于一些应用在向第三方主机请求资源时提…...

搭建Scala开发环境

一、Windows上安装Scala 1、到Scala官网下载Scala Scala2.13.10下载网址&#xff1a;https://www.scala-lang.org/download/2.13.10.html 单击【scala-2.13.10.msi】超链接&#xff0c;将scala安装程序下载到本地 2、安装Scala 双击安装程序图标&#xff0c;进入安装向导&…...

SolidWorks 2021建模技巧:用‘拉伸切除’和‘多轮廓草图’高效搞定PCB屏蔽腔设计

SolidWorks 2021建模效率革命&#xff1a;多轮廓草图与拉伸切除在PCB屏蔽设计中的高阶应用 当你在设计一块需要严格电磁屏蔽的PCB时&#xff0c;那些看似简单的腔体结构往往会成为消耗你大量时间的"黑洞"。传统的单轮廓草图拉伸方式不仅操作繁琐&#xff0c;更会在后…...

XSP25全协议 100W PD快充诱骗芯片_串口读电压电流信息

在Type-C快充技术普及的今天&#xff0c;快充诱骗协议芯片成为小家电、智能硬件、锂电设备等产品实现高效取电的核心器件。XSP25作为汇铭达推出的Type‑C受电端&#xff08;Sink&#xff09;多功能快充取电芯片&#xff0c;以全协议兼容、100W大功率输出、串口智能通信、极简外…...

oh-my-iflow:基于多智能体协作的自动化命令行开发工作流

1. 项目概述&#xff1a;当命令行遇上多智能体工作流如果你和我一样&#xff0c;每天有大量时间泡在终端里&#xff0c;那你肯定对命令行工具的效率又爱又恨。爱的是它直接、强大&#xff0c;恨的是很多复杂任务依然需要我们手动串联多个命令&#xff0c;或者在不同工具间来回切…...

统一AI编程助手配置:使用agent-anatomy提升开发效率与一致性

1. 项目概述&#xff1a;一个配置文件夹&#xff0c;统一所有AI编程助手如果你和我一样&#xff0c;日常开发中会同时使用Claude Code、Cursor、GitHub Copilot等多个AI编程助手&#xff0c;那你一定也经历过同样的烦恼&#xff1a;每个助手都需要自己独立的配置文件。今天要介…...

硬件相关项目内容介绍(硬件咱们也有相关技术支持内容哦)

硬件相关项目内容介绍&#xff08;硬件咱们也有相关技术支持内容哦&#xff09; 硬件咱们也有相关技术支持内容哦。 主要看大家喜欢什么&#xff0c;硬件内容咱们会不定期更新分享&#xff0c;大家要是喜欢&#xff0c;后续就安排上实物实操。也虚心听取大家建议&#xff0c;不…...

【CPO三维路径规划】豪猪算法CPO多无人机协同集群避障路径规划(目标函数:最低成本:路径、高度、威胁、转角)研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

Docker 的了解和使用

1. 虚拟化全虚拟化&#xff1a;虚拟机的操作系统可以和宿主机的操作系统完全不同。os层虚拟化&#xff1a;操作内核相同&#xff0c;软件虚拟化。2. docker安装 Docker容器本质上是Linux容器&#xff0c;它需要Linux内核环境才能运行。在Windows上直接运行Docker&#xff0c;需…...

公考备考提分真相:从学员视角解析粉笔讲练测评闭环教学体系

引言在公务员考试备考赛道中&#xff0c;无数考生都面临同一个核心困惑&#xff1a;花费时间和金钱报名培训机构&#xff0c;究竟能不能实现有效提分&#xff1f;不少备考者有过备考失利的经历&#xff0c;也踩过传统公考培训的诸多坑。很多传统课程老师讲课条理清晰、内容丰富…...

从原理图到Vivado:手把手教你搞定XC7Z020-CLG400的EMIO引脚分配与约束

从原理图到Vivado&#xff1a;手把手教你搞定XC7Z020-CLG400的EMIO引脚分配与约束 在ZYNQ7000系列开发中&#xff0c;EMIO引脚的正确分配与约束是实现PS与PL协同工作的关键环节。许多工程师在初次接触ZYNQ架构时&#xff0c;往往会被MIO、EMIO和AXI_GPIO的关系所困扰&#xff…...

YOLO26改进 | MSHC多尺度异构卷积:用方形核与条带核捕获复杂空间纹理,以清晰动机打造超强创新!

# YOLO26改进最新创新改进系列 | MSHC多尺度异构卷积&#xff1a;用方形核与条带核捕获复杂空间纹理&#xff0c;以清晰动机打造超强创新&#xff01; 购买相关资料后畅享一对一答疑&#xff01; 畅享超多免费持续更新且可大幅度提升文章档次的纯干货工具&#xff01; 这篇采用…...