一文搞懂Go语言错误处理【异常捕获、异常抛出】

简介: 一文搞懂Go语言错误处理【异常捕获、异常抛出】

文章目录



前言


Go 语言追求简洁优雅,所以,Go 语言不支持传统的 try…catch…finally 这种处理。


Go 中引入的错误处理方式为:defer, panic, recover,也仅仅是错处处理的模拟


Go语言的作者认为java等语言的错误处理底层实现较为复杂,就实现了函数可以返回错误类型以及


简单的异常捕获,虽然简单但是也非常精妙,大大的提高了运行效率。


一、error变量可以做什么


1.定义一个error变量


①直接new一个


err := errors.New("我是错误处理语句")


②实现Error接口


  只要实现了Error接口就可以被error类型所接收,打印的时候会直接打印实现接口时
  方法返回的字符串。


官方接口如下:


type error interface {
    Error() string
}


代码如下:


//定义一个结构体
type man struct {
  age int
}
//实现接口
func (a man) Error() string {
  str := "这是一个错误接口"
  return str
}
//创建函数返回错误类型
func judgeAge() (int, error) {
  var a man
  return 0, a
}
//主函数调用
func main() {
  _, e := judgeAge()
  if e!=nil{
    fmt.Println(e)
  }
}


2.错误的处理


将如果错误变量不为空,则将错误进行捕获打印,这里直接打印到了控制台,可以将错误打印到
  日志文件内,为以后系统的维护做保障。


代码如下:


package main
import (
  "errors"
  "fmt"
)
func main() {
  err := errors.New("我是错误处理语句")
  if err != nil {
    fmt.Println(err)
  }else {
    fmt.Println("没有错误")
  }
  fmt.Println(123)
}


3.做函数返回值


如果函数返回的错误类型值不为空,则将其进行打印


代码如下:


package main
import (
  "errors"
  "fmt"
)
func test(num1,num2 int) error {
  if num2 == 0 {
    return errors.New("除数为零")
  }
  res := num1 / num2
  fmt.Println("计算结果为=", res)
  return nil
}
func main() {
  err := test(11,0)
  if err!=nil{
    fmt.Println(err)
  }
}


4.做函数参数


一般用作处理错误变量,在需要进行错误检验的时候调用函数,不用再进行判断了


代码如下:


func PrintError(err error){
  if err!=nil{
    fmt.Println(err)
  }
}


二、模拟异常的捕获与抛出


1.defer简介


  defer后面定义的东西是在调用函数执行完的时候执行的代码
  一般用于文件描述符、数据库对象的关闭(在之前讲管道的时候有介绍过)
  defer什么什么延时执行


代码如下:


func pDefer() {
  defer fmt.Println("hahaha")
  fmt.Println("hello")
}
func main() {
  pDefer()
}
/*
打印结果
  hello
  hahaha
*/


2.使用recover模拟异常的捕获


代码如下:


package main
import (
  "fmt"
)
func test() {
  //使用defer + recover 来捕获和处理异常(返回错误变量)
  //函数执行末尾执行这个匿名函数
   defer func() {
    err := recover() // recover()内置函数,可以捕获到异常
    if err != nil {  //说明捕获到错误
      fmt.Println(err)
    }
   }()
  num1 := 10
  num2 := 0
  res := num1 / num2
  fmt.Println("计算结果为=", res)
}
func main() {
  test()
}


3.使用panic主动抛出错误


  异常的捕获,使程序还能够正常的运行,如果有致命错误就需要进行错误的抛出了,也就是宕机
  不到迫不得已千万不要使用这个函数,有可能会造成大量数据的丢失


代码如下:


package main
import (
  "errors"
  "fmt"
)
func test() error {
  num1 := 10
  num2 := 0
  if num2 == 0 {
    return errors.New("除数为零")
  }
  res := num1 / num2
  fmt.Println("计算结果为=", res)
  return nil
}
func main() {
  //无论err是否为空,都进行程序的终止
   panic(test())//内置函数2,参数使一个interface接口
}


运行结果:


6ced7944879c4bb9bb32131048e1f765.png


总结


Go语言虽然没有一个较为成熟的异常捕获机制,但是其精简的错误处理仍旧能够满足其需求,减少错误的处理大大的加快了我们的开发效率,代码的运行效率。


目录
打赏
0
0
0
0
3
分享
相关文章
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
|
2月前
|
Go 语言入门指南:切片
Golang中的切片(Slice)是基于数组的动态序列,支持变长操作。它由指针、长度和容量三部分组成,底层引用一个连续的数组片段。切片提供灵活的增减元素功能,语法形式为`[]T`,其中T为元素类型。相比固定长度的数组,切片更常用,允许动态调整大小,并且多个切片可以共享同一底层数组。通过内置的`make`函数可创建指定长度和容量的切片。需要注意的是,切片不能直接比较,只能与`nil`比较,且空切片的长度为0。
Go 语言入门指南:切片
eino — 基于go语言的大模型应用开发框架(二)
本文介绍了如何使用Eino框架实现一个基本的LLM(大语言模型)应用。Eino中的`ChatModel`接口提供了与不同大模型服务(如OpenAI、Ollama等)交互的统一方式,支持生成完整响应、流式响应和绑定工具等功能。`Generate`方法用于生成完整的模型响应,`Stream`方法以流式方式返回结果,`BindTools`方法为模型绑定工具。此外,还介绍了通过`Option`模式配置模型参数及模板功能,支持基于前端和用户自定义的角色及Prompt。目前主要聚焦于`ChatModel`的`Generate`方法,后续将继续深入学习。
404 7
企业监控软件中 Go 语言哈希表算法的应用研究与分析
在数字化时代,企业监控软件对企业的稳定运营至关重要。哈希表(散列表)作为高效的数据结构,广泛应用于企业监控中,如设备状态管理、数据分类和缓存机制。Go 语言中的 map 实现了哈希表,能快速处理海量监控数据,确保实时准确反映设备状态,提升系统性能,助力企业实现智能化管理。
44 3
eino — 基于go语言的大模型应用开发框架(一)
Eino 是一个受开源社区优秀LLM应用开发框架(如LangChain和LlamaIndex)启发的Go语言框架,强调简洁性、可扩展性和可靠性。它提供了易于复用的组件、强大的编排框架、简洁明了的API、最佳实践集合及实用的DevOps工具,支持快速构建和部署LLM应用。Eino不仅兼容多种模型库(如OpenAI、Ollama、Ark),还提供详细的官方文档和活跃的社区支持,便于开发者上手使用。
434 8
Go 语言中的 Sync.Map 详解:并发安全的 Map 实现
`sync.Map` 是 Go 语言中用于并发安全操作的 Map 实现,适用于读多写少的场景。它通过两个底层 Map(`read` 和 `dirty`)实现读写分离,提供高效的读性能。主要方法包括 `Store`、`Load`、`Delete` 等。在大量写入时性能可能下降,需谨慎选择使用场景。
Go语言实战:错误处理和panic_recover之自定义错误类型
本文深入探讨了Go语言中的错误处理和panic/recover机制,涵盖错误处理的基本概念、自定义错误类型的定义、panic和recover的工作原理及应用场景。通过具体代码示例介绍了如何定义自定义错误类型、检查和处理错误值,并使用panic和recover处理运行时错误。文章还讨论了错误处理在实际开发中的应用,如网络编程、文件操作和并发编程,并推荐了一些学习资源。最后展望了未来Go语言在错误处理方面的优化方向。
阿里双十一背后的Go语言实践:百万QPS网关的设计与实现
解析阿里核心网关如何利用Go协程池、RingBuffer、零拷贝技术支撑亿级流量。 重点分享: ① 如何用gRPC拦截器实现熔断限流; ② Sync.Map在高并发读写中的取舍。
基于 Go 语言的公司内网管理软件哈希表算法深度解析与研究
在数字化办公中,公司内网管理软件通过哈希表算法保障信息安全与高效管理。哈希表基于键值对存储和查找,如用户登录验证、设备信息管理和文件权限控制等场景,Go语言实现的哈希表能快速验证用户信息,提升管理效率,确保网络稳定运行。
37 0

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等