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 中定义的问题"的链接问题. ...
随机推荐
- 小白弄明白了 unix 时间戳的转换问题
小白对于将 unix 时间戳转换为日期时间和使用日期时间转换为 unix 时间戳,在项目中见到过很多,每次使用时不是用现有的方法转换就是网上搜索方法. 小白见过各种转换方式觉得moment库很是方便, ...
- 接口未配置在app.json文件中
微信小程序发布 提示 接口未配置在app.json文件中 狗血 昨天更新 就在app.json中添加 解决问题 "requiredPrivateInfos":[ "ge ...
- 文心一言 VS 讯飞星火 VS chatgpt (87)-- 算法导论8.2 4题
四.用go语言,设计一个算法,它能够对于任何给定的介于0到 k 之间的 n 个整数先进行预处理,然后在 O(1)时间内回答输入的 n个整数中有多少个落在区间[a..b]内.你设计的算法的预处理时间应为 ...
- 【krpano】淘宝buy+案例
这是一个类似淘宝buy+的案例,是基于krpano全景开发工具二次开发的全景视频.WebVR.360°环物.全景视频热点添加于一身的综合性案例.现在将案例上传网站供krpano技术人员和爱好者大家共同 ...
- 贝塞尔曲线的切线及其AABB问题
贝塞尔曲线的切线及其AABB问题 先聊点别的 2023 年抖音上居然还看到很多前端培训 各种直播前端教学(虽然是录播)但看起来还是有大批前往前端卷啊 说明了什么,很可能说明其它行业更难卷 这不是行业不 ...
- DotNetGuide新增C#/.NET/.NET Core充电站(让你学习不迷路)
DotNetGuide简介 记录.收集和总结C#/.NET/.NET Core基础知识.学习路线.开发实战.学习视频.文章.书籍.项目框架.社区组织.开发必备工具.常见面试题.面试须知.简历模板.以及 ...
- 什么是vfs以及它的作用
VFS(Virtual File System,虚拟文件系统)是计算机操作系统中的一个概念,它提供了一个统一的抽象层,使得操作系统可以支持不同的文件系统类型和存储设备,而不需要直接与每个文件系统进行交 ...
- 传统的MVC开发模式和前后端分离开发模式
1. 引言 在当今互联网时代,移动应用和网页应用的发展极大地推动了前后端分离开发模式的兴起.传统的后端渲染方式已经不能满足用户对高性能和优质用户体验的需求,于是前后端分离逐渐成为了一种主流的开发模式. ...
- Vue2系列(lqz)——Vue介绍
文章目录 Vue入门 零:前端目前形势 前端的发展史 一:Vue介绍 和 基本使用 1.Vue介绍 渐进式框架 网站 2.Vue特点 易用 灵活 高效 3.M-V-VM思想 ① MVVM介绍 ② MV ...
- k8s集群部署初体验
目录 ██ 环境准备[所有节点] ██ 安装Docker/kubeadm/kubelet[所有节点] ██ 部署 k8s master ██ 部署 k8s node ██ 部署网络插件[CNI] ██ ...