10.处理错误

错误处理及Go语言的独特之处

package main

import (
    "fmt"
    "io/ioutil"
)

func main(){
    file,err := ioutil.ReadFile("foo.txt")

    if err != nil {
        fmt.Println(err)
        return
    }

    fmt.Println("%s",file)
}

// output:open foo.txt: The system cannot find the file specified.
  • 使用标准库中io/ioutil包内的函数ReadFile读取文件
  • 如果有错误,就打印错误
  • 如果没有错误,打印文件中的内容
func ReatFile(filename string)  ([]byte,error)

函数总是会返回一个错误值,我们可以对它进行检查,如果发现错误值为nil,那么就说明没有发生错误,否则就发生错误,让程序员调用方法或者函数时,能够检查是否发生错误

Go语言将错误当成一种类型来处理

理解错误类型

在Go语言中,错误是一个值,标准库声明了接口error

type error interface{
    Error() string
}

创建错误

package main

import (
    "fmt"
    "errors"
)

func main(){
    err := errors.New("Something went wrong")
    if err !=nil{
        fmt.Println(err)
    }
}

//output:Something went wrong
  • 使用errors包中的方法New创建一个错误
  • 使用IF语句检查这个错误值是否为nil
  • 如果不为nil,将它打印出来

设置错误的格式

package main

import (
    "fmt"
)

func main(){
    name,role := "Richard Jupp","Drummer"
    err := fmt.Errorf("The %v %v quit",role,name)
    if err != nil{
        fmt.Println(err)
    }
}

//ourtput:The Drummer Richard Jupp quit

从函数返回错误

package main

import "fmt"

func Half(i int) (int,error){
    if i %2 !=0{
        return -1,fmt.Errorf("cannot")
    }
    return i/2,nil
}

func main(){
    fmt.Println(Half(5))
    fmt.Println(Half(2))
}

//output
// -1 cannot
// 1 <nil>

这个实例演示了Go语言处理错误的一个优点:错误处理不是在函数中,而是在调用函数的地方进行的。这在错误处理方面提供了极大的灵活性

错误和可用性

在创建错误时,一定要指明错误出现的位置,并提供解决问题的线索

No config file found.Please create one at ~/.foorc
  • 具体指出了问题所在
  • 提供了问题解决方案
  • 对用户更有礼貌

慎用panic

panic是Go语言中的一个内置函数,它终止正常的流程控制,导致程序停止执行,出现普通错误时,并不提倡这种做法,因为程序将停止执行

package main

import "fmt"

func main(){
    fmt.Println("This is executed")
    panic("Oh no,i can do no more")
    fmt.Println("this is not executed")
}

// This is executed
// panic: Oh no,i can do no more

// goroutine 1 [running]:
// main.main()
//         D:/Backup/Documents/golang/test.go:7 +0xa5
// exit status 2
  • 在程序处于无法恢复的状态,这意味着无路可走了,或者在往下程序将带来更多的问题,这种情况下,最佳的选择是让程序崩溃
  • 发生了无法处理的错误,可以使用panic
© 版权声明
THE END
喜欢就支持以下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容