Go语言学习笔记之错误和异常详解

目录
  • 错误
  • 异常
  • 总结

错误

Go 语言通过内置的错误接口提供了非常简单的错误处理机制,Error 类型是一个接口类型。

type error interface {
    Error() string
}

可以在编码中通过实现 error 接口类型来生成错误信息。

函数通常在最后的返回值中返回错误信息。

// 定义一个 DivideError 结构
type DivideError struct {
   dividee int
   divider int
}

// 实现 `error` 接口
func (de *DivideError) Error() string {
   strFormat := `
    Cannot proceed, the divider is zero.
    dividee: %d
    divider: 0
`
   return fmt.Sprintf(strFormat, de.dividee)
}

func Divide(varDividee int, varDivider int) (result int, errorMsg string) {
   if varDivider == 0 {
      dData := DivideError{
         dividee: varDividee,
         divider: varDivider,
      }
      errorMsg = dData.Error()
      return
   } else {
      return varDividee / varDivider, ""
   }
}

Divide 函数传入除数和被除数,当被除数为零时,函数抛出异常。

if result, errorMsg := Divide(100, 10); errorMsg == "" {
   fmt.Println(result)
}

这是正常情况下。

当除数为零的时候会返回错误信息。

if _, errorMsg := Divide(100, 0); errorMsg != "" {
   fmt.Println("errorMsg is: ", errorMsg)
}

异常

Go的类型系统会在编译时捕获很多错误,但有些错误只能在运行时检查,如数组访问越界、空指针引用等。这些运行时错误会引起painc异常。

当程序发生异常时,无法继续运行,使用 panic 来终止程序。

应该尽可能地使用错误,而不是使用 panic 和 recover 。只有当程序不能继续运行的时候,才应该使用 panic 和 recover 机制。

panic 有两个合理的用例:

  • 发生了一个不能恢复的错误,此时程序不能继续运行。
  • 发生了一个编程上的错误。一个接收指针参数的方法,而其他人使用 nil 作为参数调用了它。在这种情况下,可以使用 panic ,因为这是一个编程错误:用 nil 参数调用了一个只能接收合法指针的方法。

内建函数 panic

func panic(v interface{})

当程序终止时,会打印传入 panic 的参数。

package main

func main() {
    panic("panic error")
}

会打印出传入 panic 函数的信息,并打印出堆栈跟踪。

recover 是一个内建函数,用于重新获得 panic 协程的控制。

func recover() interface{}

recover 必须在 defer 函数中才能生效,在延迟函数内调用 recover ,可以取到 panic 的错误信息,并且停止 panic 续发事件。只有在相同的协程中调用 recover 才管用, recover 不能恢复一个不同协程的 panic 。

package main

import "fmt"

func outOfArray(x int) {
    defer func() {
        // recover() 可以将捕获到的 panic 信息打印
        if err := recover(); err != nil {
            fmt.Println(err)
        }
    }()
    var array [5]int
    array[x] = 1
}
func main() {
    // 故意制造数组越界 触发 panic
    outOfArray(20)
    // 如果能执行到这句 说明 panic 被捕获了
    // 后续的程序能继续运行
    fmt.Println("main...")
}

总结

到此这篇关于Go语言学习笔记之错误和异常的文章就介绍到这了,更多相关Go语言错误和异常内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Go语言错误处理异常捕获+异常抛出

    目录 一.error变量可以做什么 1.定义一个error变量 2.错误的处理 3.做函数返回值 4.做函数参数 二.模拟异常的捕获与抛出 1.defer简介 2.使用recover模拟异常的捕获 3.使用panic主动抛出错误 前言: Go 语言追求简洁优雅,所以,Go 语言不支持传统的 try…catch…finally 这种处理.Go 中引入的错误处理方式为:defer, panic, recover,也仅仅是错处处理的模拟Go语言的作者认为java等语言的错误处理底层实现较为复杂,就实现

  • Go语言学习笔记之错误和异常详解

    目录 错误 异常 总结 错误 Go 语言通过内置的错误接口提供了非常简单的错误处理机制,Error 类型是一个接口类型. type error interface { Error() string } 可以在编码中通过实现 error 接口类型来生成错误信息. 函数通常在最后的返回值中返回错误信息. // 定义一个 DivideError 结构 type DivideError struct { dividee int divider int } // 实现 `error` 接口 func (d

  • Go语言学习笔记之文件读写操作详解

    目录 文件写 文件读 小结 文件操作比较多,分为几篇来写吧.首先是文件的读写,在平时的工程化操作中使用最多. 文件写 样例代码如下 package main import ( "bufio" "fmt" "io" "os" ) //写文件 func DoWriteFile() error { _filePath := "./test.txt" _file, _err := os.OpenFile(_file

  • C#学习笔记- 随机函数Random()的用法详解

    Random.Next() 返回非负随机数: Random.Next(Int) 返回一个小于所指定最大值的非负随机数 Random.Next(Int,Int) 返回一个指定范围内的随机数,例如(-100,0)返回负数 1.random(number)函数介绍 见帮助文档,简单再提一下,random(number)返回一个0~number-1之间的随机整数.参数number代表一个整数. 示例: trace(random(5)); 2.Math.random() 见帮助文档.返回一个有14位精度的

  • Python基础之语法错误和异常详解

    目录 一.前言 二.异常 三.异常处理 3.1 try/except 3.2 try/except ... else 3.3 try-finally 四.抛出异常 4.1 raise 五.用户自定义异常 六.断言 assert 一.前言 Python assert(断言)用于判断一个表达式,在表达式条件为 false 的时候触发异常. 二.异常 即便 Python 程序的语法是正确的,在运行它的时候,也有可能发生错误.运行期检测到的错误被称为异常 三.异常处理 3.1 try/except tr

  • R语言学习ggplot2绘制统计图形包全面详解

    目录 一.序 二.ggplot2是什么? 三.ggplot2能画出什么样的图? 四.组装机器 五.设计图纸 六.机器的零件 1. 零件--散点图 1) 变换颜色 2) 拟合曲线 3) 变换大小 4) 修改透明度 5) 分层 6) 改中文 2. 零件--直方图与条形图 1) 直方图 2) 润色 3) 条形图 3. 零件--饼图 4. 零件--箱线图 5. 零件--小提琴图 6. 零件打磨 7. 超级变变变 8. 其他常用零件 七.实践出真知 八.学习资源 九.参考资料 一.序 作为一枚统计专业的学

  • R语言学习之线图的绘制详解

    目录 线图 单线图 多线图 横轴文本线图 线图 线图是反映趋势变化的一种方式,其输入数据一般也是一个矩阵. 单线图 假设有这么一个矩阵,第一列为转录起始位点及其上下游5 kb的区域,第二列为H3K27ac修饰在这些区域的丰度,想绘制一张线图展示. profile="Pos;H3K27ac -5000;8.7 -4000;8.4 -3000;8.3 -2000;7.2 -1000;3.6 0;3.6 1000;7.1 2000;8.2 3000;8.4 4000;8.5 5000;8.5"

  • Go语言学习之映射(map)的用法详解

    目录 1. 什么是 map 2. 创建 map 3. 访问 map 4. nil map和空map 5. map中元素的返回值 6. len()和delete() 7. 测试map中元素是否存在 8. 迭代遍历 map 9. 获取map中所有的key 10. 传递map给函数 1. 什么是 map Map 是一种无序的键值对的集合.Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值 Map 是无序的,我们无法决定它的返回顺序,这是因为 Map 是使用 hash

  • Go语言学习教程之反射的示例详解

    目录 介绍 反射的规律 1. 从接口值到反射对象的反射 2. 从反射对象到接口值的反射 3. 要修改反射对象,该值一定是可设置的 介绍 reflect包实现运行时反射,允许一个程序操作任何类型的对象.典型的使用是:取静态类型interface{}的值,通过调用TypeOf获取它的动态类型信息,调用ValueOf会返回一个表示运行时数据的一个值.本文通过记录对reflect包的简单使用,来对反射有一定的了解.本文使用的Go版本: $ go version go version go1.18 dar

  • Go语言学习之context包的用法详解

    目录 前言 需求一 需求二 Context 接口 emptyCtx valueCtx 类型定义 WithValue cancelCtx 类型定义 cancelCtx WithCancel timerCtx 类型定义 WithDeadline WithTimeout 总结 前言 日常 Go 开发中,Context 包是用的最多的一个了,几乎所有函数的第一个参数都是 ctx,那么我们为什么要传递 Context 呢,Context 又有哪些用法,底层实现是如何呢?相信你也一定会有探索的欲望,那么就跟

  • Python学习笔记之错误和异常及访问错误消息详解

    本文实例讲述了Python错误和异常及访问错误消息.分享给大家供大家参考,具体如下: 错误和异常 当 Python 无法解析代码时,就会发生语法错误,因为我们没有遵守正确的 Python 语法. 当在程序执行期间出现意外情况时,就会发生异常,即使代码在语法上正确无误.Python 有不同类型的内置异常. 指定异常 可以指定要在 except 块中处理哪个错误,如下所示: try: # some code except ValueError: # some code 现在它会捕获 ValueErr

随机推荐