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. 细谈商品详情API接口设计

    一.引言 随着互联网技术的发展,商品详情信息的展示和交互变得越来越重要.为了提供更好的用户体验,我们需要设计一套高效.稳定且易于扩展的商品详情API接口.本文将详细探讨商品详情API接口的设计,包括接 ...

  2. Python 导入 Excel多sheet

    Python 导入 Excel多sheet 假设表格的样式如下 import os import sys import django BASE_DIR = os.path.dirname(os.pat ...

  3. 使用 OpenTelemetry 构建 .NET 应用可观测性(2):OpenTelemetry 项目简介

    前世今生 OpenTracing OpenTracing 项目启动于 2016 年,旨在提供一套分布式追踪标准,以便开发人员可以更轻松地实现分布式追踪. OpenTracing 定义了一套 Traci ...

  4. 如何get一个终身免费续期的定制数字人?

    想拥有一个"数字分身" 吗?给你一个终身免费续期的特权. 定制周期长?训练.运营成本高?成片效果生硬?无法应用于实际场景? 随着AIGC技术的快速发展,虚拟数字人的生成效率不断提高 ...

  5. Solution -「GXOI / GZOI 2019」宝牌一大堆

    Description Link. Summarizing the fucking statement is the last thing in the world I ever want to do ...

  6. 我封装的一个REPR轮子 Biwen.QuickApi

    Biwen.QuickApi 项目介绍 [QuickApi("hello/world")] public class MyApi : BaseQuickApi<Req,Rsp ...

  7. 用现代C++写一个python的简易型list

    std::variant介绍:en.cppreference.com/w/cpp/utility/variant 通过泛型模板(仅提供了int, double, string三种类型的存储),实现了a ...

  8. C++高精度算法

    文章结尾有惊喜 在 C++ 中,unsigned long long最大只能表示到2^64-1=18446744073709551615264−1=18446744073709551615 而有些题目 ...

  9. 【短道速滑十】非局部均值滤波的指令集优化和加速(针对5*5的搜索特例,可达到单核1080P灰度图 28ms/帧的速度)。

    非局部均值滤波(Non Local Means)作为三大最常提起来的去燥和滤波算法之一(双边滤波.非局部均值.BM3D),也是有着很多的论文作为研究和比较的对象,但是也是有着致命的缺点,速度慢,严重的 ...

  10. svn: E200007: Retrieval of mergeinfo unsupported解决

     http://blog.csdn.net/intlgj/article/details/39080605 svn: E200007: Retrieval of mergeinfo unsupport ...