·  error类型是一个接口类型,也是一个Go语言的内建类型。在这个接口类型的声明中只包含了一个方法Error。这个方法不接受任何参数,但是会返回一个string类型的结果。它的作用是返回错误信息的字符串表示形象。我们使用error类型的方式通常是,在函数声明结果列表的最后,声明一个该类型的结果。同时在调用这个函数之后,先判断它返回的最后一个结果是否"不为nil"。如果不为nil那么就进入错误处理流程,否则就继续进行正常的流程。

  1. package main
  2.  
  3. import (
  4. "errors"
  5. "fmt"
  6. )
  7.  
  8. func echo(request string) (response string, err error) {
  9. if request == "" {
  10. //如果request为空,调用error.New函数为结果赋值,然后忽略后边操作返回。response返回空字符串
  11. err = errors.New("empty content")
  12. return
  13. }
  14. response = fmt.Sprintf("echo: %s", request)
  15. return //err值为nil
  16. }
  17.  
  18. func main() {
  19. for _, req := range []string{"", "hello!"} {
  20. fmt.Printf("request: %s\n", req)
  21. resp, err := echo(req)
  22. if err != nil {
  23. fmt.Printf("error: %s\n", err)
  24. continue
  25. }
  26. fmt.Printf("response: %s\n", resp)
  27. }
  28. }

  

由于error是一个接口类型,所以即使同为error类型的错误值,它们的实际类型也可能不同。怎样判断一个错误值具体代表的是哪一类错误呢?

  1)对于类型在已知范围内的一系列错误值,一般使用类型断言表达式或类型switch语句来判断

  2)对于已有相应变量且类型相同的一系列错误值,一般直接使用判等操作来判断

  3)对于没有响应变量且类型未知的一系列错误值,只能使用其错误信息的字符串表示形式来做判断

  1. func underlyingError(err error) error {
  2. //获取和返回已知操作系统相关错误的潜在错误值
  3. switch err := err.(type) {
  4. case *os.PathError:
  5. return err.Err //返回函数参数err的Err字段
  6. case *os.LinkError:
  7. return err.Err
  8. case *os.SyscallError:
  9. return err.Err
  10. case *exec.Error:
  11. return err.Err
  12. }
  13. return err //直接把函数参数值返回
  14. }
  15.  
  16. printError := func(i int, err error) {
  17. if err == nil {
  18. fmt.Println("nil error")
  19. return
  20. }
  21. err = underlyingError(err)
  22. switch err {
  23. case os.ErrClosed:
  24. fmt.Printf("error(closed)[%d]: %s\n", i, err)
  25. case os.ErrInvalid:
  26. fmt.Printf("error(invalid)[%d]: %s\n", i, err)
  27. case os.ErrPermission:
  28. fmt.Printf("error(permission)[%d]: %s\n", i, err)
  29. }
  30. }

怎样根据实际情况给与恰当的错误值?

  构建错误体系的基本方式有两种:

  1)用类型建立起树形结构的错误体系,用统一字段建立起可追根溯源的链式错误关联。

  2)预先创建一些代表已知错误的错误值

【Go】错误处理的更多相关文章

  1. 航空概论(历年资料,引之百度文库,PS:未调格式,有点乱)

    航空航天尔雅 选择题1. 已经实现了<天方夜谭>中的飞毯设想.—— A——美国2. 地球到月球大约—— C 38 万公里3. 建立了航空史上第一条定期空中路线—— B——德国4. 对于孔明 ...

  2. 日期格式代码出现两次的错误 ORA-01810

    错误的原因是使用了两次MM . 一.Oracle中使用to_date()时格式化日期需要注意格式码 如:select to_date('2005-01-01 11:11:21','yyyy-MM-dd ...

  3. ASP.NET Core应用的错误处理[3]:ExceptionHandlerMiddleware中间件如何呈现“定制化错误页面”

    DeveloperExceptionPageMiddleware中间件利用呈现出来的错误页面实现抛出异常和当前请求的详细信息以辅助开发人员更好地进行纠错诊断工作,而ExceptionHandlerMi ...

  4. ASP.NET Core应用的错误处理[2]:DeveloperExceptionPageMiddleware中间件如何呈现“开发者异常页面”

    在<ASP.NET Core应用的错误处理[1]:三种呈现错误页面的方式>中,我们通过几个简单的实例演示了如何呈现一个错误页面,这些错误页面的呈现分别由三个对应的中间件来完成,接下来我们将 ...

  5. 实时的.NET程序错误监控产品Exceptionless

    Exceptionless可以对ASP.NET, Web API, WebForms, WPF, Console, 和 MVC 应用提供错误监控.上传.报表服务.使用时需要在Exceptionless ...

  6. 一个粗心的Bug,JSON格式不规范导致AJAX错误

    一.事件回放  今天工作时碰到了一个奇怪的问题,这个问题很早很早以前也碰到过,不过没想到过这么久了竟然又栽在这里. 当时正在联调一个项目,由于后端没有提供数据接口,于是我直接本地建立了一个 json ...

  7. SQL Server 致程序员(容易忽略的错误)

    标签:SQL SERVER/MSSQL/DBA/T-SQL好习惯/数据库/需要注意的地方/程序员/容易犯的错误/遇到的问题 概述 因为每天需要审核程序员发布的SQL语句,所以收集了一些程序员的一些常见 ...

  8. C# - 值类型、引用类型&走出误区,容易错误的说法

    1. 值类型与引用类型小总结 1)对于引用类型的表达式(如一个变量),它的值是一个引用,而非对象. 2)引用就像URL,是允许你访问真实信息的一小片数据. 3)对于值类型的表达式,它的值是实际的数据. ...

  9. 记一个mvn奇怪错误: Archive for required library: 'D:/mvn/repos/junit/junit/3.8.1/junit-3.8.1.jar' in project 'xxx' cannot be read or is not a valid ZIP file

    我的maven 项目有一个红色感叹号, 而且Problems 存在 errors : Description Resource Path Location Type Archive for requi ...

  10. 【WCF】错误协定声明

    在上一篇烂文中,老周给大伙伴们介绍了 IErrorHandler 接口的使用,今天,老周补充一个错误处理的知识点——错误协定. 错误协定与IErrorHandler接口不同,大伙伴们应该记得,上回我们 ...

随机推荐

  1. VMware网络适配器设置

    VMware网络连接主要有三种方式,分别是桥接,NAT和Host-only. 桥接:直接使用的是真实机的物理网卡(有线网卡,无线网卡),会占用局域网中的一个IP,因此在设置虚拟机IP时要避免与同网段的 ...

  2. Install your Application into RaspberryPi2 and automatically start up

    如何安装和卸载应用程序到RaspberryPi2? 如何配置应用程序在RaspberryPi2开机后自动启动? How to install your app into RaspberryPi2? H ...

  3. ubuntu 16.04 国内源安装docker

    1. 通过curl命令安装 检查是否安装curl root@ros-OptiPlex-3050:~# which curlroot@ros-OptiPlex-3050:~# 更新安装 root@ros ...

  4. ubuntu16 安装elasticsearch6.3问题

    1.ubuntu16 安装elasticsearch6.3 elasticsearch 6.3需要的java的版本是1.8以上 安装java1.8 详见本博客的安装java https://www.c ...

  5. 聊聊C语言和ABAP

    这个公众号之前的文章,分享的都是Jerry和SAP成都研究院的同事在工作中学到的一些知识和感受.而今天这篇文章,写作的由来是因为最近我又参与了SAP成都数字创新空间应聘者的面试,和一些朋友聊了一些关于 ...

  6. 使用JavaScript调用手机平台上的原生API

    我之前曾经写过一篇文章使用Cordova将您的前端JavaScript应用打包成手机原生应用,介绍了如何使用Cordova框架将您的用JavaScript和HTML开发的前端应用打包成某个手机平台(比 ...

  7. 爬虫5_python2_使用 Beautiful Soup 解析数据

    使用 Beautiful Soup 解析数据(感谢东哥) 有的小伙伴们对写正则表达式的写法用得不熟练,没关系,我们还有一个更强大的工具,叫Beautiful Soup,有了它我们可以很方便地提取出HT ...

  8. UNIX 进程间通讯(IPC)概念(Posix,System V IPC)

     IPC(Inter-Process Communication,进程间通讯)可以有三种信息共享方式(随文件系统,随内核,随共享内存).(当然这里虽然说是进程间通讯,其实也是可以和线程相通的). 相对 ...

  9. dedeCMS数据库字段详细介绍

    dede_addonarticle 附加文章表 aid int(11) 文章编号 typeid int(11) 分类栏目编号 body mediumtext 文章内容 dede_addonflash ...

  10. 初涉「带权并查集」&&bzoj3376: [Usaco2004 Open]Cube Stacking 方块游戏

    算是挺基础的东西 Description     约翰和贝茜在玩一个方块游戏.编号为1到n的n(1≤n≤30000)个方块正放在地上.每个构成一个立方柱.    游戏开始后,约翰会给贝茜发出P(1≤P ...