经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Go语言 » 查看文章
Go 自定义error错误
来源:cnblogs  作者:周伯通的麦田  时间:2021/1/11 9:37:57  对本文有异议

原文链接: http://www.zhoubotong.site/post/17.html
Go的error比较灵活.但是自身对error处理的机制有不太好用,我们可以自定义错误输出: 
只要所有实现了 Error() 方法的对象都可以, 这里给个比较简单的demo,后续整理一个error的优化封装:

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. type NameEmtpyError struct {
  6. name string
  7. }
  8. //NameEmtpyError实现了 Error() 方法的对象都可以
  9. func (e *NameEmtpyError) Error() string {
  10. return "name 不能为空"
  11. }
  12. func NameCheck(name string) (bool, error) {
  13. if name == "" {
  14. return false, &NameEmtpyError{name} // 注意error这里必须是地址&引用
  15. }
  16. return true, nil
  17. }
  18. func main() {
  19. name := ""
  20. if check, err := NameCheck(name); err != nil {
  21. fmt.Println(err)
  22. } else {
  23. fmt.Println(check)
  24. }
  25. } 

在go里定义错误异常的方式有这么两种,但都需要你的返回值是error类型的:
    第一种方式是使用golang标准库包errors 来定义错误。使用方法很简单,只需要 return errors.New(“错误信息”)  。 这样就是一个最简单的错误返回。

    第二种方式是借用struct结构体,创建一个struct的Error()方法,注意这个方法名是Error,不然会出现找不到Error方法。
下面我们看一个比较完整的Error的使用方法。不仅有errors,还有struct Error()方式. 

  1. package main
  2. import (
  3. "errors"
  4. "fmt"
  5. )
  6. type equalError struct {
  7. Num int
  8. }
  9. //方法名字是Error()
  10. func (e equalError) Error() string {
  11. return fmt.Sprintf("当前数字是 %d ,大于10", e.Num)
  12. }
  13. //使用errors.New简单生成
  14. func Equal(n int) (int, error) {
  15. if n > 10 {
  16. return -1, errors.New("大于10") //生成一个简单的 error 类型
  17. }
  18. return n, nil
  19. }
  20. func DiyEqual(n int) (int, error) {
  21. if n > 10 {
  22. return -1, equalError{Num: n} // 会调用equalError的Error方法
  23. }
  24. return n, nil
  25. }
  26. func main() {
  27. //使用errors.New生成error对象
  28. if result, err := Equal(20); err != nil {
  29. fmt.Println("错误:", err)
  30. } else {
  31. fmt.Println("结果:", result)
  32. }
  33. //不适用erros,自定义错误方式.
  34. if result, err := DiyEqual(20); err != nil {
  35. fmt.Println("错误:", err)
  36. } else {
  37. fmt.Println("结果:", result)
  38. }
  39. }

当然实际开发项目也不建议这么写,太lower不说,也不好扩展. 下一篇准备写个demo,封装优化错误输出的处理.

原文链接:http://www.cnblogs.com/phpper/p/14243506.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号