经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Go语言 » 查看文章
GO基础之异常处理
来源:cnblogs  作者:小禾点点  时间:2019/11/8 9:43:26  对本文有异议

一、异常

1、 错误指程序中出现不正常的情况,从而导致程序无法正常执行。
•大多语言中使用try... catch... finally语句执行。
假设我们正在尝试打开一个文件,文件系统中不存在这个文件。这是一个异常情况,它表示为一个错误。
2、 Go语言中没有try...catch

  • • Go语言通过内置的错误类型提供了非常简单的错误处理机制。
  • •错误值可以存储在变量中,通过函数中返回。
  • 如果一个函数或方法返回一个错误,按照惯例,它必须是函数返回的最后一个值。
  • •处理错误的惯用方式是将返回的错误与nil进行比较。
  • nil值表示没有发生错误,而非nil值表示出现错误。
  • •如果不是nil,需打印输出错误。

go中error的源码

  1. package errors
  2. // New returns an error that formats as the given text.
  3. // Each call to New returns a distinct error value even if the text is identical.
  4. func New(text string) error {
  5. return &errorString{text}
  6. }
  7. // errorString is a trivial implementation of error.
  8. type errorString struct {
  9. s string
  10. }
  11. func (e *errorString) Error() string {
  12. return e.s
  13. }

 

二、go中的异常处理

 

 

 

  1. package main
  2. import (
  3. "math"
  4. "fmt"
  5. "os"
  6. "github.com/pkg/errors"
  7. )
  8. func main() {
  9. // 异常情况1
  10. res := math.Sqrt(-100)
  11. fmt.Println(res)
  12. res , err := Sqrt(-100)
  13. if err != nil {
  14. fmt.Println(err)
  15. } else {
  16. fmt.Println(res)
  17. }
  18. //异常情况2
  19. //res = 100 / 0
  20. //fmt.Println(res)
  21. res , err = Divide(100 , 0)
  22. if err != nil {
  23. fmt.Println(err.Error())
  24. } else {
  25. fmt.Println(res)
  26. }
  27. //异常情况3
  28. f, err := os.Open("/abc.txt")
  29. if err != nil {
  30. fmt.Println(err)
  31. } else {
  32. fmt.Println(f.Name() , "该文件成功被打开!")
  33. }
  34. }
  35. //定义平方根运算函数
  36. func Sqrt(f float64)(float64 , error) {
  37. if f<0 {
  38. return 0 , errors.New("负数不可以获取平方根")
  39. } else {
  40. return math.Sqrt(f) , nil
  41. }
  42. }
  43. //定义除法运算函数
  44. func Divide(dividee float64 , divider float64)(float64 , error) {
  45. if divider == 0 {
  46. return 0 , errors.New("出错:除数不可以为0!")
  47. } else {
  48. return dividee / divider , nil
  49. }
  50. }
View Code

go中error的创建方式

  1. //error创建方式一
  2. func Sqrt(f float64)(float64 , error) {
  3. if f<0 {
  4. return 0 , errors.New("负数不可以获取平方根")
  5. } else {
  6. return math.Sqrt(f) , nil
  7. }
  8. }
  9. //error创建方式二;设计一个函数:验证年龄。如果是负数,则返回error
  10. func checkAge(age int) (string, error) {
  11. if age < 0 {
  12. err := fmt.Errorf("您的年龄输入是:%d , 该数值为负数,有错误!", age)
  13. return "", err
  14. } else {
  15. return fmt.Sprintf("您的年龄输入是:%d ", age), nil
  16. }
  17. }

四、自定义错误

• 1、定义一个结构体,表示自定义错误的类型
• 2、让自定义错误类型实现error接口的方法:Error() string
• 3、定义一个返回error的函数。根据程序实际功能而定。

  1. package main
  2. import (
  3. "time"
  4. "fmt"
  5. )
  6. //1、定义结构体,表示自定义错误的类型
  7. type MyError struct {
  8. When time.Time
  9. What string
  10. }
  11. //2、实现Error()方法
  12. func (e MyError) Error() string {
  13. return fmt.Sprintf("%v : %v", e.When, e.What)
  14. }
  15. //3、定义函数,返回error对象。该函数求矩形面积
  16. func getArea(width, length float64) (float64, error) {
  17. errorInfo := ""
  18. if width < 0 && length < 0 {
  19. errorInfo = fmt.Sprintf("长度:%v, 宽度:%v , 均为负数", length, width)
  20. } else if length < 0 {
  21. errorInfo = fmt.Sprintf("长度:%v, 出现负数 ", length)
  22. } else if width < 0 {
  23. errorInfo = fmt.Sprintf("宽度:%v , 出现负数", width)
  24. }
  25. if errorInfo != "" {
  26. return 0, MyError{time.Now(), errorInfo}
  27. } else {
  28. return width * length, nil
  29. }
  30. }
  31. func main() {
  32. res , err := getArea(-4, -5)
  33. if err != nil {
  34. fmt.Printf(err.Error())
  35. } else {
  36. fmt.Println("面积为:" , res)
  37. }
  38. }
View Code

 

原文链接:http://www.cnblogs.com/jalja/p/11817447.html

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

本站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号