28、错误error
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的更多相关文章
- MySQL出现Errcode:28错误提示解决办法
mysql出现Error writing file \'xxx\'( Errcode:28)的原因有很多种,下面我来总结一些常用的关于引起Errcode:28错误原因与解决方法. 问题一,是log ...
- 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 ...
- 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 ...
- Apache错误:[error] (OS 10038)在一个非套接字上尝试了一个操作
Apache错误:[error] (OS 10038)在一个非套接字上尝试了一个操作 博客分类: vb2005xu软件学习 OSApache防火墙PHPWindows 日志如下:[ ...
- 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 ...
- 【转】win7与ubuntu双系统,删除ubuntu后,启动错误error:no such partition grub rescue的修复--不错
原文网址:http://blog.sina.com.cn/s/blog_541900d50101eu9r.html win7于ubuntu双系统,进入windows后直接格式化硬盘分区将ubuntu删 ...
- Python 3.3 try catch所有的错误Error,不包括Exception。关键在于 sys.exc_info()
import os; import sys; #---------------------------------------------- def main( ) : try : a = 1 / 0 ...
- 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的驱 ...
- 异常 - 虚拟机初始化错误 - Error occurred during initialization of VM
目录 1 环境配置信息 1.1 服务器配置信息 1.2 Tomcat启动参数 2 问题描述 3 问题解决 4 关于vm.overcommit_memory参数 4.1 vm.overcommit_me ...
- VS2110。VC++编译错误"error LNK2005: 已经在 XXX.obj 中定义的问题"
有时候我们会在头文件当中定义一些全局变量或者全局函数,这种做法会比较方便,但有时候会出现“编译错误"error LNK2005: 已经在 XXX.obj 中定义的问题"的链接问题. ...
随机推荐
- OpenLDAP 自助修改密码系统
一.创建docker-compose文件 root@xx:~# mkdir self-service-password root@xx:~# cd self-service-password root ...
- C盘无法创建文件处理
icacls c:\ /setintegritylevel M 打开终端执行上方命令,亲测可用
- 微服务架构|go-zero 的自适应熔断器
原文链接: go-zero 的自适应熔断器 上篇文章我们介绍了微服务的限流,详细分析了计数器限流和令牌桶限流算法,这篇文章来说说熔断. 熔断和限流还不太一样,限流是控制请求速率,只要还能承受,那么都会 ...
- Hadoop环境安装与配置
1.基础操作系统环境安装(略) 2.JDK的安装与配置 当前各大数据软件如Hadoop等,仍然停留在Java 8上,在本实验选用的是Java 8.在自己的Linux系统中,jdk可以使用如下命令进行一 ...
- springboot3框架搭建
Spring Boot 3.0.0已经发布一段时间了,越来越多的公司考虑将技术框架升级到最新版本,JDK也相应要求JDK17以上.对应Spring Boot 2.x的版本,建议先升级到Spring B ...
- 运行解压版tomcat中的startup.bat一闪而退的解决办法
Tomcat的startup.bat,它调用了catalina.bat,而catalina.bat则调用了setclasspath.bat,只要在setclasspath.bat的开头声明环境变量(红 ...
- 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(1)
在我们的SqlSugar的开发框架中,整合了Winform端.Vue3+ElementPlus的前端.以及基于UniApp+Vue+ThorUI的移动前端几个前端处理,基本上覆盖了我们日常的应用模式了 ...
- 研发效能|DevOps 是运维还是开发?
DevOps 到底是 Dev还是Ops?答:属于研发工程师序列,偏向研发域,而不是运维域. DevOps是研发工程师 DevOps 主要服务的对象就是所有产研团队的人员,与产研团队打交道比较多,相互配 ...
- Solution -「CF 1039D」You Are Given a Tree
Description Link. 有一棵 \(n\) 个节点的树,其中一个简单路径的集合被称为 \(k\) 合法当且仅当:树的每个节点至多属于其中一条路径,且每条路径恰好包含 \(k\) 个点. 对 ...
- Python面向对象——面向对象介绍、实现面向对象编程、定义类、再调用类产生对象、总结__init__方法、查找顺序
文章目录 面向对象介绍 实现面向对象编程 一:先定义类 二:再调用类产生对象 总结__init__方法 查找顺序 面向对象介绍 ''' 面向过程: 核心是"过程"二字 过程的终极奥 ...