非零基础自学Golang 第10章 错误处理 10.3 Go语言宕机 10.4 宕机恢复

news2024/9/22 21:15:40

非零基础自学Golang

文章目录

      • 非零基础自学Golang
      • 第10章 错误处理
        • 10.3 Go语言宕机
        • 10.4 宕机恢复
          • 10.4.1 recover捕获宕机
          • 10.4.2 recover应用

第10章 错误处理

10.3 Go语言宕机

一般而言,只有当程序发生不可逆的错误时,才会使用panic方法来触发宕机。

panic方法是Go语言的一个内置函数,使用panic方法后,程序的执行将直接中断。

panic方法的源代码如下,由于其参数为空接口类型,因此我们可以传入任意类型的值作为宕机内容:

func panic(v interface{})

[ 动手写 10.3.1]

package main

import "fmt"

func main() {

   panic("Serious bug")
   fmt.Println("Invalid code") //程序退出,无法执行该行代码
}

运行结果

在这里插入图片描述

调用panic方法后,之后的代码都是无效代码,因为程序会直接退出。

如果遇到以下情形,可以调用panic方法来退出程序:

  • 程序处于失控状态且无法恢复,继续执行将会影响其他正常程序,引发操作系统异常甚至是死机。
  • 发生不可预知的错误。

10.4 宕机恢复

10.4.1 recover捕获宕机

Go语言通过内置函数recover来捕获宕机,类似于其他编程语言中的try-catch机制。

在使用panic方法触发宕机后,且在退出当前函数前,会调用延迟执行语句defer,代码示例如下:

[ 动手写 10.4.1]

package main

import "fmt"

func protect() {
   defer func() {
      fmt.Println("func protect exit")
   }()

   panic("Serious bug") // 触发宕机
}

func main() {
   defer func() { // protect 函数退出前执行defer 语句
      fmt.Println("func main exit")
   }()

   protect()
   fmt.Println("Invalid code")
}

运行结果

在这里插入图片描述

以上程序流程如下:

  1. protect函数内的panic方法触发宕机。
  2. 由于protect函数内的匿名函数通过defer语句延迟执行,在panic方法触发宕机后,且在退出protect函数前,会执行protect函数中的匿名函数,打印“func protect exit”。
  3. 由于main函数内的匿名函数通过defer语句延迟执行,在main函数退出前会执行main函数中的匿名函数,打印“func main exit”。
  4. 程序退出。

由于defer语句延迟执行的特性,我们可以通过**“defer语句+匿名函数+recover方法”**来完成对宕机的捕获。

[ 动手写 10.4.2]

package main

import "fmt"

func protect() {
	defer func() {
		if err := recover(); err != nil { //recover() 获取panic() 传入的参数
			fmt.Println(err)
		}
	}()

	panic("Serious bug")
}

func main() {

	protect()
	fmt.Println("valid code")
}

运行结果

在这里插入图片描述

以上程序通过recover方法获取到panic()传入的参数,进行打印展示,程序从宕机点退出当前函数后继续执行。

10.4.2 recover应用

在实际编程中,我们会专门封装一个函数,以一种安全模式来运行所有传入的方法,核心思想与动手写10.4.2类似,代码如下:

[ 动手写 10.4.3]

package main

import "fmt"

func protect(f func()) { // 以安全模式来运行所有传入的方法

   defer func() {
      if err := recover(); err != nil {
         fmt.Println(err)
      }
   }()

   f()
}

func main() {

   protect(func() { // 模拟函数1
      fmt.Println("This is function 1")
      panic("Serious bug from function 1")
   })

   protect(func() { // 模拟函数2
      fmt.Println("This is function 2")
      panic("Serious bug function 2")
   })

   fmt.Println("valid code")
}

运行结果

在这里插入图片描述

没毛病,protect函数用于以安全模式运行所有传入的匿名函数或闭包后的执行函数,即使发生panic,主程序仍然能继续正常运行。

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

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

相关文章

云计算运营—02FusionSphere 6.5 服务器虚拟化运营

FusionSphere 6.5 服务器虚拟化运营 1、虚拟化 特性介绍 云操作系统架构 Tool/PV driver(虚拟机驱动) Tools是虚拟机的驱动程序。 安装并启动Tools后,用户无需做任何操作,Tools即可提供以下功能: 1、为虚拟机提供高性能的磁盘I/0和网络I/0功能 2、为…

Element-plus的通用使用方法

Element-plus的通用使用方法说明一、组件属性的使用二、组件内部事件的使用三、组件插槽的使用四、组件外部方法的使用1、使用外部方法是要调用标签的$refs2.使用方法完说明 本教程适用于Element-plus的使用非常熟练本教程是对Element-plus的高度总结组件属性的使用组件插槽的…

中国自然地理分区数据集 (含农业区划、森林工程、生态保护区、九大流域等)

一中国生态功能保护区数据 代码 名称 类型 1 秦岭山地生态功能保护区 水涵养生态功能保护区 2 若尔盖一玛曲生态功能保护区 水涵养生态功能保护区 3 滇西北生态功能保护区 水涵养生态功能保护区 4 珠江源(云南部分)生态功能保护区 水涵养生态功能保护区 5 雅鲁藏布江源头生态…

web前端-javascript-Array数组方法详解(增删改,遍历,截取,连接,转字符串,反转数组,排序)

文章目录数组的方法1. push() 添加2. pop() 删除3. unshift() 添加4. shift() 删除5. forEach() 遍历1) 说明2) 使用6. slice() 截取7. splice() 删除8. concat() 连接9. join() 转String字符串10. reverse() 反转11. sort() 排序1) 简单用法2) 自己指定排序规则数组的方法 1.…

[附源码]Python计算机毕业设计Django新能源汽车租赁

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

全文检索、精准查询、坐标查询、复合查询、排序、分页、高亮

文章目录DSL查询文档DSL查询分类全文检索查询精准查询地理坐标查询复合查询算分函数查询布尔查询搜索结果处理排序单字段 排序多字段 排序地理坐标排序分页高亮RestClient查询文档发起查询请求解析响应match查询精确查询布尔查询排序、分页距离排序高亮高亮请求构建高亮结果解析…

NAT处理流程、分类和使用场景

1、NAT分为源NAT、目的NAT、双向(Bidirection)NAT 源NAT适用于私网访问公网的情形 目的NAT适用于公网访问私网的情形 双向NAT适用于双方都非真实地址的情形 看下图,第一条匹配源NAT Server,如果匹配则2直接转换目的地址 ---> …

32位单片机存储器中地址膨胀映射作用位带操作和对应地址位置关系

映射的作用 所谓映射,实际上是有另一种控制同一个位置功能的方式。就相当于两个方式操作对一个功能起到相同作用 位带(bitband)操作:直译出来的,根本意思是将原地址中每一个字节位都扩展成占用一个32bit位的地址(一个…

ubuntu18中ISCE2.6+stamps实现PSInSAR时序地表形表处理

一 安装ubuntu 教程参考:https://baijiahao.baidu.com/s?id1741674041146755999&wfrspider&forpc 建议安装18或者20版本,版本过高会导致版本不匹配的问题。 二安装Anaconda3 教程参考:https://zhuanlan.zhihu.com/p/269183148 注意…

[附源码]计算机毕业设计Python4S店汽车售后服务管理系统(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

RBAC与连表查询

文章目录0. 前言1. RBAC模型1.1 什么是RBAC模型1.2 准备工作2. 连表操作2.1 常用连表图2.2 准备SQL语句2.3 Mybatis 连表3. 总结与补充0. 前言 连表学习、练习经典:RBAC权限模型、5表联查。 本文采用的持久层实现方式:Mybatis/Mybatis-Plus。 学习基础…

QT系列第6节 QT中常用控件

1. QComboBox 下拉列表 2. QPlainTextEdit QPlainTextEdit的文字内容以QTextDocument类型存储,函数document返回这个文档 对象的指针 QTextDocument是内存中的文本对象,以文本块方式存储,每个段落以换行符结束。 QTextDocument提供一些…

常用日期类

第一代日期类 Date类 Date:精确到毫秒,代表特定的瞬间 当需要获取当前时间时可以直接new一个Date对象,使用无参构造器 Date date new Date();日期转文本 但是直接使用的话,它是国外的时间格式:Sat Dec 17 17:02:3…

Apache IoTDB v1.0.0安装试用小结( linux环境)

1 简介 Apache IoTDB 是一个开源物联网时序数据库。 github地址:https://github.com/apache/iotdb 2 下载 下载地址:https://iotdb.apache.org/Download/ 下载,输入命令: wget https://archive.apache.org/dist/iotdb/1.0.…

【简单工厂模式-2】简单工厂模式的代码实现及使用场景

简单工厂模式并属于Gof 23个经典设计模式其中之一,只是通常会将它作为学习其他工厂设计模式的入门,而且在开发中,简单工厂模式也是比较常见的,设计思想比较简单。 1. 定义 简单工厂模式定义一个工厂类,提供获取对象的…

Makefile、.mk、.bp、Blueprint、Soong、kati工具链的关系

一、Android版本相应的发展演变过程: Android 7.0引入ninja和kati Android 8.0使用Android.bp来替换Android.mk,引入Soong Android 9.0强制使用Android.bp 二、生成.ninja工具链关系:Android.bp、Blueprint、Soong、kati:总之都是用来把Make…

数据库拆分4--使用sharding-jdbc来实现水平拆分

有三张表 user log order表,先将user log 和order垂直分库,然后将user表水平拆分 配置文件 spring.shardingsphere.enabledtruespring.shardingsphere.datasource.nameswim-user,wim-orderspring.shardingsphere.datasource.wim-user.typecom.alibaba.…

vue入门--2

1.计算属性和侦听器 计算属性 VS 方法 如果不使用计算属性,在 methods 里定义了一个方法,也可以实现相同的效果,甚至该方法还可以接受参数,使用起来 更灵活。 既然 methods 同样可以解决模板中复杂逻辑计算的问题,那么…

2266. 统计打字方案数-动态规划

2266. 统计打字方案数-动态规划 Alice 在给 Bob 用手机打字。数字到字母的 对应 如下图所示。 为了 打出 一个字母,Alice 需要 按 对应字母 i 次,i 是该字母在这个按键上所处的位置。 比方说,为了按出字母 s ,Alice 需要按 7 …

语雀导出markdown的图片外链问题

本文节选自本人博客:https://www.blog.zeeland.cn/archives/rgoioiabeoi32 Introduction 本人因为经常使用语雀写博客,但是因为语雀转markdown的时候图片存在防外链行为,如果想要把转出的markdown发表在其他平台,就需要把md中所有…