错误处理及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
暂无评论内容