首页 > 其他分享 >Go语言入门10(异常处理)

Go语言入门10(异常处理)

时间:2023-04-23 13:59:25浏览次数:35  
标签:tmp 10 入门 err fmt Println error Go 异常

异常处理

panic 异常处理

​ 如果出现了panic异常,那么会停止当前函数的运行,然后会找recover()方法,如果没有的话,就会报错退出程序,如果有就会执行recover的方法体中的方法

​ 我们可以使用defer延迟处理函数来捕获panic异常,用recover()来从错误场景中恢复,必须的在defer修饰的方法中使用,不然不生效,panic抛出异常,defer具备延迟处理功能,所以最后这种兜底的活只能defer来做

// 定义一个带有panic异常的方法
func Test01(tmp int) string {
	fmt.Println("This is a test!")
	// 如果传入的参数是负数,那么就会抛出panic异常    
	if tmp <= 0 {
		panic("不能传递非正数")
	}
	return "这是一个正数"
}

func main() {
    // 使用defer + recover来兜底
	defer func() {
		err := recover()
		if err != nil {
			fmt.Println(err)
		}
	}()
	fmt.Println(Test01(-1))
    // 由于panic异常会停止当前函数运行,所以下面的输出不会被执行
	fmt.Println("异常处理之后")
}

errors 异常处理

​ Go语言有一个预先定义的 error 接口类型,同时也提供了一个包 errors,包中有一个 errorString 结构体实现了 error 接口 。任何时候当你需要一个新的错误类型,都可以用 errors 包的errors.New函数接收合适的错误信息来创建

​ error异常不会中断程序运行,所以不需要defer 和 recover 兜底

// 返回值要声明error类型
func Test02(tmp int) (res string, err error) {
	if tmp > 0 {
        // 如果正常输出,也需要返回nil
		return "这是正数", nil
	} else {
        // 使用函数创建error异常
		err := errors.New("不能传递非正数!")
		return "", err
	}
}

func main() {
	res, err := Test02(34)
	if err != nil {
		fmt.Println("出现错误:", err)
	} else {
		fmt.Println("传参正确:", res)
	}
    // error异常不会中断运行,下面的输出会被执行
    fmt.Println("异常处理之后")
}

自定义异常

// 新建一个异常结构体,用来存储参数
type customException struct {
	contain string
}

// 实现Error接口
func (tmp *customException) Error() string {
	err := fmt.Sprintf("这是一个自定义错误: %s", tmp.contain)
	return err
}

func Test03(tmp int) (res string, err error) {
	if tmp < 0 {
		panic(&customException{"不能传入负数"})
	} else if tmp == 0 {
		err = &customException{"不能传入0"}
		return
	} else {
		return "这是一个正数", nil
	}
}

func main() {
	defer func() {
		err := recover()
		if err != nil {
			fmt.Println(err)
		}
	}()
	res, err := Test03(-1)
	if err != nil {
		fmt.Println("出现错误:", err)
	} else {
		fmt.Println("传参正确:", res)
	}
	fmt.Println("异常处理之后")
}

标签:tmp,10,入门,err,fmt,Println,error,Go,异常
From: https://www.cnblogs.com/te9uila/p/17346313.html

相关文章

  • Windows10安装Transmission,并使用Web远程访问教程
    安装Transmission从官方路径下载Transmission安装包 https://transmissionbt.com/download/在组件安装界面,需要把Daemon和Webinterface,同步安装上。下载配置transmission-web-control3.访问https://github.com/ronggang/transmission-web-control ,下载最新源码包......
  • k8s-问题:[root@master log]# kubectl get node The connection to the server 192.168
    记一次测试虚拟机异常关机导致的问题[root@masterlog]#kubectlgetnodeTheconnectiontotheserver192.168.0.105:6443wasrefused-didyouspecifytherighthostorport?这个问题网上的大部分解决方案是kubeadminit直接这么搞我相信肯定能恢复,毕竟是重新初始化,但......
  • k8s 1.23 traefik v2.9.10 的应用
    1.部署traefik1.1相关版本介绍k8s:v1.23.17traefik:v2.9.10链接地址:GitHub:https://github.com/traefik/traefikDockerhub:https://hub.docker.com/_/traefik官网:https://doc.traefik.io/traefikgateway-api:https://github.com/kubernetes-sigs/gateway-api......
  • Django全栈进阶之路1 Django4下载与安装
    python下载安装:下载网址:https://www.python.org/downloads/ 安装方法:https://www.cnblogs.com/beichengshiqiao/p/16153586.html新版的python一般无需配置环境,在安装的时候勾选带有AddPython3.10toPATH的选项即可,如果需要手动配置的,参考:https://www.cnblogs.com/beicheng......
  • 基于django+ansible+webssh运维自动化管理系统
    基于django+ansible+webssh运维自动化管理系统 前言最初开发这个基于Djangoansible运维自动化管理系统的想法其实从大学时候就已经有了,但是苦于技术原因和没有线上环境原因一直没有开发,现在有了这个技术和环境之后开始着手开发了这个项目,项目难点在于你要理解如何设计数据库,......
  • maven入门教程
    1.1. Maven简介Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。Maven除了以程序构建能力为特色之外,还提供高级项目管理工具。由于Maven的缺省构建规则有较高的可重用性,所以常常用两三行Maven构建脚本就可以构建简单的项......
  • Win10 资源管理器导航栏设置:显示库,删除6个文件夹和隐藏OneDrive
    如果你和我一样是刚刚从windows7升级到windows10的,我猜你也会发现资源管理器导航栏里略微恼人的变化:库文件不见了,我的电脑里出现了无法隐藏也无法删除的“我的音乐”之类文件(这一个页面里面显示两边也是醉了!),一个懒得使用的Onedrive占据一方。搞掉他!但是好像不是那么简单。花了点时......
  • 学习-10
    1.正文1.linux-centos7的目录结构【了解】2.linux中常用的命令[重点]3.linux中安装常用的软件【重点】2.linux-centos7的目录结构/:centos7的根目录bin:脚本目录--包含很多linux命令sbin:命令目录--包含linux的命令etc:配置目录--可以配置很多参数--IP地址,环......
  • 2010年湖南省对口高考真题
    一、选择题1、下列不是C语言合法标识符的是__________。A._124            B.124abc          C.sum124          D.a_124 2、若有如图1所示存储结构,且变量定义为structnode{intdata;structnode*next;}p,q,r;若要实现图2所示的存储结......
  • SpringDay01-入门基础知识、Bean的配置(一)
    Spring(黑马)一、基础知识1.1传统JavaWeb的缺点传统的JavaWeb在实现某个主要的业务逻辑时需要做的事情:new一个实现类对象,然后通过对象调用某个主要的方法;开启事务、提交事务、回滚事务;在日志中记录修改数据;在日志中记录异常数据等。以上传统方法带来的问题:实现类与接......