1、是什么?

在实际的项目中,我们希望通过程序的错误信息快速定位问题,但是又不喜欢错误处理;代码就会很冗余又啰嗦。Go语言没有提供类似Java、C#语言中的try...catch异常处理方法,而是通过函数返回值逐层往上抛。这种设计,鼓励工程师在代码中显示的检查错误,而非忽略错误,好处就是避免漏掉应该处理的错误。但是代码带来的弊端就是,让代码啰嗦了。

错误是指在可能出现问题的地方出现了问题。比如打开一个文件时失败,这种情况再人们的意料之中

而异常指的是不应该在出现问题的地方出现了问题。比如NPE,这种情况再人们的意料之外。错误是业务流程的一部分,而异常不是。

Go语言中错误也是一种类型,错误用内置的error表示,就像其他类型如:int、float64.错误值可以存储在变量中,从函数中返回,等等...

2、错误演示

创建错误的方式:

1、errors.New()

2、fmt.Errorf()

/**
* @author ly (个人博客:https://www.cnblogs.com/ybbit)
* @date 2023/9/30 23:43
* @tags 喜欢就去努力的争取
*/
package main import (
"errors"
"fmt"
) func main() { /*
创建错误的方式:
1、errors.New()
2、fmt.Errorf()
*/ err1 := errors.New("我创建的错误")
fmt.Println(err1)
fmt.Printf("%T\n", err1) err2 := fmt.Errorf("错误信息", 500)
fmt.Println(err2)
fmt.Printf("%T \n", err2) err3 := checkAge(-10)
if err3 != nil {
fmt.Println(err3)
return
}
fmt.Println("程序...go...on...")
} func checkAge(age int) error {
if age < 0 {
// return errors.New("年龄不合法")
return fmt.Errorf("您给定的年龄是:%d,不合法", age)
}
fmt.Println("年龄为:", age)
return nil
}

3、错误类型表示

/**
* @author ly (个人博客:https://www.cnblogs.com/ybbit)
* @date 2023/10/1 11:16
* @tags 喜欢就去努力的争取
*/
package main import (
"fmt"
"net"
"os"
"path/filepath"
) func main() {
f, err := os.Open("test.txt")
if err != nil {
fmt.Println("err", err)
if ins, ok := err.(*os.PathError); ok {
fmt.Println("1.Op", ins.Op)
fmt.Println("2.Path", ins.Path)
fmt.Println("3.Err", ins.Err)
}
return
}
fmt.Println("文件打开成功:", f.Name()) addr, err := net.LookupHost("www.baidu999999.com")
fmt.Println(err)
if ins, ok := err.(*net.DNSError); ok {
if ins.Timeout() {
fmt.Println("操作超时...")
} else if ins.Temporary() {
fmt.Println("临时性错误...")
} else {
fmt.Println("出错了")
}
}
fmt.Println(addr) // 匹配指定错误
files, err := filepath.Glob("[")
if err != nil && err == filepath.ErrBadPattern {
fmt.Println(err)
return
}
fmt.Println("files:", files)
}

注意:不要忽略错误,也就是不要使用_去忽略他

4、自定义error

/**
* @author ly (个人博客:https://www.cnblogs.com/ybbit)
* @date 2023/10/1 11:37
* @tags 喜欢就去努力的争取
*/
package main import (
"fmt"
"math"
) func main() {
// 自定义错误
radius := -3.0
area, err := circleArea(radius)
if err != nil {
fmt.Println(err)
if err, ok := err.(*areaError); ok {
fmt.Printf("半径为:%.2f \n", err.radius)
}
return
}
fmt.Println("圆形的面积为:", area)
} type areaError struct {
msg string
code int
radius float64
} func (e *areaError) Error() string {
return fmt.Sprintf("error:半径,%.2f,%s,%d", e.radius, e.msg, e.code)
} func circleArea(redius float64) (float64, error) {
if redius < 0 {
return 0, &areaError{"半径不合法", 500, redius}
}
return math.Pi * redius * redius, nil
}
/**
* @author ly (个人博客:https://www.cnblogs.com/ybbit)
* @date 2023/10/7 20:26
* @tags 喜欢就去努力的争取
*/
package main import "fmt" func main() { length, width := 5.7, -8.2
area, err := rectArea(length, width)
if err != nil {
fmt.Println(err)
if err, ok := err.(*areaError); ok {
if err.lengthNegative() {
fmt.Printf("长度小于0,length: %.2f \n", length)
}
if err.widthNegative() {
fmt.Printf("宽度小于0,wigth: %.2f \n", length)
}
}
return
}
fmt.Println("面积S为:", area)
} type areaError struct {
msg string
length float64
width float64
} func (e *areaError) Error() string {
return e.msg
} func (e *areaError) lengthNegative() bool {
return e.length < 0
} func (e *areaError) widthNegative() bool {
return e.width < 0
} func rectArea(length, width float64) (float64, error) {
msg := ""
if length < 0 {
msg = "长度小于0"
}
if width < 0 {
if msg == "" {
msg = "宽度小于0"
} else {
msg += ",宽度也小于0"
}
}
if msg != "" {
return 0.0, &areaError{msg, length, width}
}
return length * width, nil
}

28、错误error的更多相关文章

  1. MySQL出现Errcode:28错误提示解决办法

    mysql出现Error writing file \'xxx\'( Errcode:28)的原因有很多种,下面我来总结一些常用的关于引起Errcode:28错误原因与解决方法.   问题一,是log ...

  2. Entrypoint undefined = index.html html-webpack-plugin 错误ERROR in Error: Child compilation failed: Module build failed (from ./node_modules/html-webpack-plu SyntaxError: Unexpected token )

    Entrypoint undefined = index.html html-webpack-plugin 错误 ERROR in Error: Child compilation failed: M ...

  3. Ubuntu12.04安装64位系统出现编译错误error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or dir

    问题: Ubuntu12.04安装64位系统出现编译错误error while loading shared libraries: libz.so.1: cannot open shared obje ...

  4. Apache错误:[error] (OS 10038)在一个非套接字上尝试了一个操作

    Apache错误:[error] (OS 10038)在一个非套接字上尝试了一个操作          博客分类: vb2005xu软件学习 OSApache防火墙PHPWindows  日志如下:[ ...

  5. mysql安装过程中出现错误ERROR 1820 (HY000): You must SET PASSWORD before executing this statement解决

    mysql安装过程中出现错误ERROR 1820 (HY000): You must SET PASSWORD before executing this statement解决   最近新装好的my ...

  6. 【转】win7与ubuntu双系统,删除ubuntu后,启动错误error:no such partition grub rescue的修复--不错

    原文网址:http://blog.sina.com.cn/s/blog_541900d50101eu9r.html win7于ubuntu双系统,进入windows后直接格式化硬盘分区将ubuntu删 ...

  7. Python 3.3 try catch所有的错误Error,不包括Exception。关键在于 sys.exc_info()

    import os; import sys; #---------------------------------------------- def main( ) : try : a = 1 / 0 ...

  8. centos 7 运行Quartus ii 17.0 标准版,下载程序时遇到错误error (209053): unexpected error in jtag server -- error code 89

    对于错误error (209053): unexpected error in jtag server -- error code 89,它产生的原因在于,在linux系统下,Quartus ii的驱 ...

  9. 异常 - 虚拟机初始化错误 - Error occurred during initialization of VM

    目录 1 环境配置信息 1.1 服务器配置信息 1.2 Tomcat启动参数 2 问题描述 3 问题解决 4 关于vm.overcommit_memory参数 4.1 vm.overcommit_me ...

  10. VS2110。VC++编译错误"error LNK2005: 已经在 XXX.obj 中定义的问题"

    有时候我们会在头文件当中定义一些全局变量或者全局函数,这种做法会比较方便,但有时候会出现“编译错误"error LNK2005: 已经在 XXX.obj 中定义的问题"的链接问题. ...

随机推荐

  1. vscode 中 Markdown 粘贴图片的位置

    背景 自从 typora 开始收费后, 不少人开始寻找其他的 Markdown编辑器, 我觉得 vscode 就是一个很不错的选择 虽然不能像 typora 在Markdown预览中编辑, 但是左右布 ...

  2. 文心一言 VS 讯飞星火 VS chatgpt (88)-- 算法导论8.3 1题

    一.用go语言,参照图 8-3 的方法,说明 RADIX-SORT在下列英文单词上的操作过程:COW,DOG,SEA,RUG,ROW,MOB, BOX, TAB, BAR, EAR,TAR, DIG, ...

  3. SSMS 显示行号

    SSMS 显示行号 SSMS2022--工具--选项--文本编辑器--所有语言--常规--勾选"行号"--确定.

  4. 使用Blazor WASM实现可取消的多文件带校验并发分片上传

    前言 上传大文件时,原始HTTP文件上传功能可能会影响使用体验,此时使用分片上传功能可以有效避免原始上传的弊端.由于分片上传不是HTTP标准的一部分,所以只能自行开发相互配合的服务端和客户端.文件分片 ...

  5. 其它——Postman做接口测试

    文章目录 一 介绍 二 下载安装 三 使用 四 批量接口测试(创建collections) 五 导出与导入同事的接口 5.1 导出 5.2 导入 一 介绍 在前后端分离开发时,后端工作人员完成系统接口 ...

  6. Vue2系列(lqz)——Vue介绍

    文章目录 Vue入门 零:前端目前形势 前端的发展史 一:Vue介绍 和 基本使用 1.Vue介绍 渐进式框架 网站 2.Vue特点 易用 灵活 高效 3.M-V-VM思想 ① MVVM介绍 ② MV ...

  7. a-2b

    a-2b   描述 输入两个高精度数a和b,求a-2b的值. 输入 输入两行,第一行是被减数a,第二行是减数b(a>2b并且a,2b的位数不同且不存在借位,且b+b不存在进位). 输出 一行,即 ...

  8. ERROR: nginx-1.22.1 installation failed.

    libraries. You can either do not enable the module or install the libraries.make: *** No rule to mak ...

  9. Oracle 11g数据库详解(2017-01-23更新)

    Oracle 11g数据库详解 整理者:赤勇玄心行天道 QQ:280604597 Email:280604597@qq.com 大家有什么不明白的地方,或者想要详细了解的地方可以联系我,我会认真回复的 ...

  10. CC BY-SA 4.0原文及翻译

    CC BY-SA 4.0原文及翻译 英文参考链接 中文参考链接 原文: Attribution 4.0 International (CC BY 4.0) This is a human-readab ...