经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Go语言 » 查看文章
Go语言学习笔记之错误和异常详解
来源:jb51  时间:2022/7/25 15:26:48  对本文有异议

错误

Go 语言通过内置的错误接口提供了非常简单的错误处理机制,Error 类型是一个接口类型。

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

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

函数通常在最后的返回值中返回错误信息。

  1. // 定义一个 DivideError 结构
  2. type DivideError struct {
  3. dividee int
  4. divider int
  5. }
  6.  
  7. // 实现 `error` 接口
  8. func (de *DivideError) Error() string {
  9. strFormat := `
  10. Cannot proceed, the divider is zero.
  11. dividee: %d
  12. divider: 0
  13. `
  14. return fmt.Sprintf(strFormat, de.dividee)
  15. }
  16.  
  17. func Divide(varDividee int, varDivider int) (result int, errorMsg string) {
  18. if varDivider == 0 {
  19. dData := DivideError{
  20. dividee: varDividee,
  21. divider: varDivider,
  22. }
  23. errorMsg = dData.Error()
  24. return
  25. } else {
  26. return varDividee / varDivider, ""
  27. }
  28. }

Divide 函数传入除数和被除数,当被除数为零时,函数抛出异常。

  1. if result, errorMsg := Divide(100, 10); errorMsg == "" {
  2. fmt.Println(result)
  3. }

这是正常情况下。

当除数为零的时候会返回错误信息。

  1. if _, errorMsg := Divide(100, 0); errorMsg != "" {
  2. fmt.Println("errorMsg is: ", errorMsg)
  3. }

异常

Go的类型系统会在编译时捕获很多错误,但有些错误只能在运行时检查,如数组访问越界、空指针引用等。这些运行时错误会引起painc异常。

当程序发生异常时,无法继续运行,使用 panic 来终止程序。

应该尽可能地使用错误,而不是使用 panic 和 recover 。只有当程序不能继续运行的时候,才应该使用 panic 和 recover 机制。

panic 有两个合理的用例:

  • 发生了一个不能恢复的错误,此时程序不能继续运行。
  • 发生了一个编程上的错误。一个接收指针参数的方法,而其他人使用 nil 作为参数调用了它。在这种情况下,可以使用 panic ,因为这是一个编程错误:用 nil 参数调用了一个只能接收合法指针的方法。

内建函数 panic

  1. func panic(v interface{})

当程序终止时,会打印传入 panic 的参数。

  1. package main
  2.  
  3. func main() {
  4. panic("panic error")
  5. }

会打印出传入 panic 函数的信息,并打印出堆栈跟踪。

recover 是一个内建函数,用于重新获得 panic 协程的控制。

  1. func recover() interface{}

recover 必须在 defer 函数中才能生效,在延迟函数内调用 recover ,可以取到 panic 的错误信息,并且停止 panic 续发事件。只有在相同的协程中调用 recover 才管用, recover 不能恢复一个不同协程的 panic 。

  1. package main
  2.  
  3. import "fmt"
  4.  
  5. func outOfArray(x int) {
  6. defer func() {
  7. // recover() 可以将捕获到的 panic 信息打印
  8. if err := recover(); err != nil {
  9. fmt.Println(err)
  10. }
  11. }()
  12. var array [5]int
  13. array[x] = 1
  14. }
  15. func main() {
  16. // 故意制造数组越界 触发 panic
  17. outOfArray(20)
  18. // 如果能执行到这句 说明 panic 被捕获了
  19. // 后续的程序能继续运行
  20. fmt.Println("main...")
  21. }

总结

到此这篇关于Go语言学习笔记之错误和异常的文章就介绍到这了,更多相关Go语言错误和异常内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号