【Go】Go 语言教程--Go 错误处理(二十)

你的名字 2023-10-13 21:29 24阅读 0赞

往期回顾:

  • Go 语言教程–介绍(一)
  • Go 语言教程–语言结构(二)
  • Go 语言教程–语言结构(三)
  • Go 语言教程–数据类型(四)
  • Go 语言教程–语言变量(五)
  • Go 语言教程–GO语言常量(六)
  • Go 语言教程–GO语言运算符(七)
  • Go 语言教程–GO条件和循环语句(八)
  • Go 语言教程–GO语言函数(九)
  • Go 语言教程–GO语言变量作用域(十)
  • Go 语言教程–GO语言数组(十一)
  • Go 语言教程–GO语言指针(十二)
  • Go 语言教程–GO语言结构体(十三)
  • Go 语言教程–GO语言切片(Slice)(十四)
  • Go 语言教程–Go 语言范围(Range)(十五)
  • Go 语言教程–Go 语言Map(集合)(十六)
  • Go 语言教程–Go 语言递归函数(十七)
  • Go 语言教程–Go 语言类型转换(十八)
  • Go 语言教程–Go 语言接口(十九)

文章目录

  • 前言
  • 实例

前言

错误和异常是两个不同的概念,非常容易混淆。很多程序员习惯将一切非正常情况都看做错误,而不区分错误和异常,即使程序中可能有异常抛出,也将异常及时捕获并转换成错误。从表面上看,一切皆错误的思路更简单,而异常的引入仅仅增加了额外的复杂度。

但事实并非如此。众所周知,Golang遵循“少即是多”的设计哲学,追求简洁优雅,就是说如果异常价值不大,就不会将异常加入到语言特性中。

Go 语言通过内置的错误接口提供了非常简单的错误处理机制。

error 类型是一个接口类型,这是它的定义:

  1. type error interface {
  2. Error() string
  3. }

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

函数通常在最后的返回值中返回错误信息。使用 errors.New 可返回一个错误信息:

  1. func Sqrt(f float64) (float64, error) {
  2. if f < 0 {
  3. return 0, errors.New("math: square root of negative number")
  4. }
  5. // 实现
  6. }

对于Go语言(golang)的错误设计,相信很多人已经体验过了,它是通过返回值的方式,来强迫调用者对错误进行处理,要么你忽略,要么你处理(处理也可以是继续返回给调用者),对于golang这种设计方式,我们会在代码中写大量的if判断,以便做出决定。

  1. func main() {
  2. conent,err:=ioutil.ReadFile("filepath")
  3. if err !=nil{
  4. //错误处理
  5. }else {
  6. fmt.Println(string(conent))
  7. }
  8. }

这类代码,在我们编码中是非常的,大部分情况下error都是nil,也就是没有任何错误,但是非nil的时候,意味着错误就出现了,我们需要对他进行处理。

在下面的例子中,我们在调用 Sqrt 的时候传递的一个负数,然后就得到了 non-nil 的 error 对象,将此对象与 nil 比较,结果为 true,所以 fmt.Println(fmt 包在处理 error 时会调用 Error 方法)被调用,以输出错误,请看下面调用的示例代码:

  1. result, err:= Sqrt(-1)
  2. if err != nil {
  3. fmt.Println(err)
  4. }

实例

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. // 定义一个 DivideError 结构
  6. type DivideError struct {
  7. dividee int
  8. divider int
  9. }
  10. // 实现 `error` 接口
  11. func (de *DivideError) Error() string {
  12. strFormat := `
  13. Cannot proceed, the divider is zero.
  14. dividee: %d
  15. divider: 0
  16. `
  17. return fmt.Sprintf(strFormat, de.dividee)
  18. }
  19. // 定义 `int` 类型除法运算的函数
  20. func Divide(varDividee int, varDivider int) (result int, errorMsg string) {
  21. if varDivider == 0 {
  22. dData := DivideError{
  23. dividee: varDividee,
  24. divider: varDivider,
  25. }
  26. errorMsg = dData.Error()
  27. return
  28. } else {
  29. return varDividee / varDivider, ""
  30. }
  31. }
  32. func main() {
  33. // 正常情况
  34. if result, errorMsg := Divide(100, 10); errorMsg == "" {
  35. fmt.Println("100/10 = ", result)
  36. }
  37. // 当除数为零的时候会返回错误信息
  38. if _, errorMsg := Divide(100, 0); errorMsg != "" {
  39. fmt.Println("errorMsg is: ", errorMsg)
  40. }
  41. }

执行以上程序,输出结果为:

  1. 100/10 = 10
  2. errorMsg is:
  3. Cannot proceed, the divider is zero.
  4. dividee: 100
  5. divider: 0

发表评论

表情:
评论列表 (有 0 条评论,24人围观)

还没有评论,来说两句吧...

相关阅读