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

 更新时间:2022年07月25日 11:49:19   作者:鹿鱼  
Go语言采用返回值的形式来返回错误,这一机制既可以让开发者真正理解错误处理的含义,也可以大大降低程序的复杂度,下面这篇文章主要给大家介绍了关于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语言错误和异常内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Go语言中单链表的使用

    详解Go语言中单链表的使用

    链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。本文将通过实例为大家详解Go语言中单链表的常见用法,感兴趣的可以了解一下
    2022-08-08
  • Golang中Delve版本太低无法Debug的问题

    Golang中Delve版本太低无法Debug的问题

    这篇文章主要介绍了Golang中Delve版本太低无法Debug的问题,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • golang常用库之字段参数验证库-validator使用详解

    golang常用库之字段参数验证库-validator使用详解

    这篇文章主要介绍了golang常用库:字段参数验证库-validator使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借价值,需要的朋友可以参考下
    2020-10-10
  • Go使用协程批量获取数据加快接口返回速度

    Go使用协程批量获取数据加快接口返回速度

    这篇文章主要介绍了Go使用协程批量获取数据加快接口返回速度,使用Go语言后,可以并发获取,极大提升效率,需要的朋友可以参考下
    2023-02-02
  • 一文带你掌握GoLang中的指针

    一文带你掌握GoLang中的指针

    针是 Go 编程语言的重要组成部分,它们提供了一种直接引用和操作内存中数据的方法,在这篇文章中,我们将探讨一些技巧和技巧,以掌握 GoLang 中的指针并编写高效的代码,需要的可以参考一下
    2023-05-05
  • 一文详解golang通过io包进行文件读写

    一文详解golang通过io包进行文件读写

    这篇文章主要介绍了golang通过io包进行文件读写文中有详细的代码示例。对学习或工资有很好的帮助,需要的小伙伴可以参考阅读一下
    2023-04-04
  • 深入了解Golang 哈希算法之MD5、SHA-1和SHA-256

    深入了解Golang 哈希算法之MD5、SHA-1和SHA-256

    哈希算法是计算机科学领域中一种重要的技术,它将任意长度的输入数据映射为固定长度的哈希值,在本篇文章中,我们将深入探讨Golang中的哈希算法,从多个方面介绍其详细内容,希望通过本文的阅读你将对 Golang哈希算法有更全面的理解
    2023-05-05
  • Go使用Viper库读取YAML配置文件的示例代码

    Go使用Viper库读取YAML配置文件的示例代码

    Viper是适用于Go应用程序的完整配置解决方案,它被设计用于在应用程序中工作,并且可以处理所有类型的配置需求和格式,本文给大家介绍了Go使用Viper库读取YAML配置文件的方法,需要的朋友可以参考下
    2024-05-05
  • Go开发神器Air热加载的安装使用探究

    Go开发神器Air热加载的安装使用探究

    这篇文章主要介绍了Go开发神器Air热加载使用实例探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • golang线程安全的map实现

    golang线程安全的map实现

    这篇文章主要介绍了golang线程安全的map实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03

最新评论