七.错误处理

news2025/1/11 0:04:31

目录

1、错误处理

1、error一般是处理一些比较低级的错误,不会造成程序中断或者宕机。

2、panic一般是发生了致命的错误时才会被调用,例如数组越界,空指针等等,

2.1 手动调用panic

2.2 数组越界造成panic

2、recover函数


1、错误处理

异常处理(error-错误、panic-恐慌、recover-恢复)

1、error一般是处理一些比较低级的错误,不会造成程序中断或者宕机。

简单使用标准库的两个错误函数:

package main 
import ( 
"errors" 
"fmt" 
) 
func main(){ 
err1 := fmt.Errorf("%s", "this is a Errorf") 
fmt.Println("err1: ", err1) 
err2 := errors.New("this New error") 
fmt.Println("err2: ", err2) 
} 

error常用的用法

package main

import (

"errors"

"fmt"

)

// error 为nil说明正常,否则报错,信息从errors.New获取

func MyDiv(a, b int) (result int, err error){

err = nil

if b == 0 {

err = errors.New("分母不能为0")

}else{

result = a/b

}

return // 等价于 return result, err

}

func main(){

ret, err := MyDiv(2, 2)

if err == nil{

fmt.Println("ret = ", ret)

}else{

fmt.Println("表达式存在非法值, err: ", err)

}

ret, err = MyDiv(2, 0)

if err == nil{

fmt.Println("ret = ", ret)

}else{

fmt.Println("表达式存在非法值, err: ", err)

}

}

// 最终可以通过这个函数获取一个errorString结构,从而可以调用Error方法。

func New(text string) error{

return &errorString(text)

}

============================================================

2、panic一般是发生了致命的错误时才会被调用,例如数组越界,空指针等等,

当然我们也可以手动调用panic()函数去触发。类似C语言的assert()断言函

数。

2.1 手动调用panic

package main

import "fmt"

func testa(){

fmt.Println("aaaaaaaaaaaaaa")

}

func testb(){

fmt.Println("bbbbbbbbbbbbbb")

// 手动调用panic()会触发断言

panic("manual triggered assertions, the program breaks")

}

func testc(){

fmt.Println("ccccccccccccccc")

}

func main(){

testa()

testb()

testc()

}

结果如下:

2.2 数组越界造成panic

package main

import "fmt"

func testa(){

fmt.Println("aaaaaaaaaaaaaa")

}

func testb(index int){

// 数组越界造成panic断言

var x [10]int

fmt.Println("x: ", x[index])

}

func testc(){

fmt.Println("ccccccccccccccc")

}

func main(){

testa()

testb(10) // 数组越界触发断言

testc()

}

结果如下:

如果是空指针

2、recover函数

当发生panic错误时,会中断程序,但是有时候我们又不想程序中断,

我们可以使用recover函数去捕获这个中断。但是需要注意:

recover()只有在defer调用的函数有效。

当该函数中定义了defer,并且该函数发生了panic错误,那么该错误会被捕

获,程序会恢复正常。

package main 
import "fmt" 
func testa(){ 
	fmt.Println("aaaaaaaaaaaaaa") 
} 
func testb(index int){ 
// 设置recover 
defer func () { 
	if err := recover() ; err != nil { 
	//fmt.Println("errInfo: ", recover())// 不要再次调用recover()作 
	为信息,因为此时调用是正常的, 
	//因为没有错误了,错误已经在if中被捕获掉 
	fmt.Println("errInfo: ", err) 
	} 
}() 
	// 数组越界造成panic断言 
	var x [10]int 
	fmt.Println("x: ", x[index]) 
} 
func testc(){ 
	fmt.Println("ccccccccccccccc") 
} 
func main(){ 
	testa() 
	testb(10) // 数组越界触发断言 
	testc() 
} 

结果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/707185.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PaddleSeg中交互式分割EISeg的使用

EISeg(Efficient Interactive Segmentation)是基于飞桨开发的一个高效智能的交互式分割标注软件。它涵盖了通用、人像、遥感、医疗、视频等不同方向的高质量交互式分割模型。另外,将EISeg获取到的标注应用到PaddleSeg提供的其他分割模型进行训练,便可得到…

stm32-iic 时序驱动

数据发送 #include "IIC.h" #include "delay.h"void IIC_Init(void){GPIO_InitTypeDef GPIO_InitStruct;//使能GPIPFRCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//初始GPIGB8 GPIGB9 GPIO_InitStruct.GPIO_Pin GPIO_Pin_8 | GPIO_Pin_9; …

4.28 白噪声功率谱密度的估计

前一节有下面结论: 什么仿真的白噪声波形是均匀的,均匀的特点是相关函数在0时刻是相关的(自己和自己相关的)0以外时刻都互相不相关

PLC 网关设备如何进行数据采集?

引言: 在现代工业领域,PLC(可编程逻辑控制器)被广泛应用于自动化控制系统。为了实现高效的数据收集和分析,工业边缘网关扮演着重要角色。本文将探讨PLC网关设备如何进行数据采集,并介绍一款优秀的工业边缘网…

JVM-jvisualvm性能监控可视化工具使用与eden-s0-s1分配分析(三)

目录 第一步:安装jvisualvm 第二步:安装VisualvmGc插件 方式一:jvisualvm工具直接下载安装 方式二:去官网下载导入安装 总结 第三步:idea安装VisualvM Launcher插件 第四步:演示young中eden、s0、s1垃…

浅谈小程序开发 [2018年]

一、问题背景 随着App市场趋近于饱和,大部分用户已经养成了使用习惯,加上开发和推广新的App的成本高,使得开发新的App很难在市场上生存。在此背景下,小程序应运而生,2016年,张小龙的微信团队首次推出了微信…

vmware虚拟机无法启动修复

虚拟机场景报错:Entering emergency mode. Exit the shell to continue. #输入journalctl journalctl #如果出现以下描述: failed to mount /sysroot. Dependency failed for Initrd root File System. Dependency failed for Reload configuration fro…

信息服务上线渗透检测网络安全检查报告和解决方案4(网站风险等级评定标准、漏洞危害分级标准、漏洞安全建议)

系列文章目录 信息服务上线渗透检测网络安全检查报告和解决方案3(系统漏洞扫描、相对路径覆盖RPO漏洞、nginx漏洞修复)信息服务上线渗透检测网络安全检查报告和解决方案2(安装文件信息泄漏、管理路径泄漏、XSS漏洞、弱口令、逻辑漏洞、终极上传漏洞升级)信息服务上线渗透检测网…

CCF-CSP真题《202303-2 垦田计划》思路+python,c++满分题解

想查看其他题的真题及题解的同学可以前往查看:CCF-CSP真题附题解大全 试题编号:202303-2试题名称:垦田计划时间限制:1.0s内存限制:512.0MB问题描述: 问题描述 顿顿总共选中了 n 块区域准备开垦田地&#xf…

交换机是否会梦见机器学习?面向网络内分类

交换机是否会梦见机器学习?面向网络内分类 摘要 机器学习目前正在推动技术和社会革命。虽然可编程交换机已被证明对网络内计算非常有用,但是在可编程交换机内进行机器学习迄今为止取得了很少的成功。不利用网络设备进行机器学习会付出高昂的代价&#…

华为OD机试真题 JavaScript 实现【寻找峰值】【牛客练习题】

一、题目描述 给定一个长度为n的数组nums,请你找到峰值并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个所在位置即可。 1.峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于; 2.假设 nums[-1] n…

【容器起不来~tomcat】

记录一次线上容器~tomcat起不来的场景: **部门由于资金有限,只能用tomcat去部署,话不多说直接贴图: Docker 镜像 Tomcat 启动失败– 查看线上日志,日志报错了,报错内容如下: 1,Error response from daemon: driver failed programming external connectivityon endpoint jen…

Safari开发者工具

Safari开发者工具 1 开发者功能2 开发者功能可以干什么2.1 捕获模拟器的请求 1 开发者功能 Safari->首选项->高级->开启“在菜单栏中显示‘开发’菜单” 2 开发者功能可以干什么 2.1 捕获模拟器的请求 当我们向查看模拟器上一个完整的网络请求时,往往…

libevent实践06:监听TCP服务器

简介 函数evconnlistener_new_bind struct evconnlistener * evconnlistener_new_bind(struct event_base *base, evconnlistener_cb cb,void *ptr, unsigned flags, int backlog, const struct sockaddr *sa,int socklen) 参数解析: base:事件集合 ev…

Python 字符串的使用

字符串使用 1. 字符串的定义方式 双引号或者单引号括起来的数据,就是字符串。使用三引号括起来也是字符串,并支持换行。 例: # 使用反斜线 对单引号进行转义 name1 i\ Tom name2 "Rose" name3 Tom name4 ""&qu…

8-什么是数组重塑?【视频版】

目录 问题视频解答 问题 视频解答 点击观看: 8-什么是数组重塑?

[mmcv系列] pip安装mmcv记录

文章目录 1.查看torch和cuda版本1.安装1.1从预编译包安装1.2 源码编译安装 2.校验报错:from mmcv import Config 可以直接 参考教程: 找到pip安装,选择自己的cuda和torch版本,复制指令到终端安装即可: 1.查看torch和c…

归并排序的具体实现过程

作者主页:paper jie的博客_CSDN博客-C语言,算法详解领域博主 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于《算法详解》专栏,本专栏是针对于大学生,编程小白精心…

TCP三握四挥

TCP三握四挥 TCP最关键的三个步骤:建立连接、数据传输、释放连接,这里的三次握手实现的是服务端和客户端建立连接;四次挥手实现的是服务端和客户端释放连接。 三次握手: 建立数据连接 TCP连接需要三次握手的原因: 三次…

静力触探数据智能预处理(1)

静力触探数据智能预处理(1) 前言 数据处理方式已由手工1.0、计算机辅助2.0到人工智能3.0的趋势发展。现场采集的静力触探数据存在大量的异常数据,需要后期处理;但是目前还未见一个静力触探数据预处理的软件,数据预处…