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 中定义的问题"的链接问题. ...
随机推荐
- Mysql中文字符串提取datetime
DATE_FORMAT无法用于提取含中文字符的时间字符串中的时间, 可以通过STR_TO_DATE来提取其中的信息, 如下: SELECT STR_TO_DATE("2018年11月05日 ...
- 浅谈Code Review
1. 什么是Code Review Code Review(CR)即代码评审,又名代码走查,是指对软件开发过程中编写的代码进行检查和评估的一种实践.它通常由其他团队成员.同事或专门的质量保证团队成员来 ...
- Springboot项目使用Undertow替换内置Tomcat服务器,实现RESTFUL接口web应用
Maven实例:pom.xml文件中添加更换依赖 <dependency> <groupId>org.springframework.boot</groupId> ...
- 关于tiptop gp5.2采购模块,价格变更的随笔
采购价格变更要看具体环节,你可以把他当作是三张表,采购价格表.收货价格表.入库价格表,这些还好处理,如果已抛砖到财务端生成账款再要求改价格就更复杂,会产生更多张表了,改起来也就更复杂. 用apmt91 ...
- ios ipa apple company 开发者账号申请分享攻略
ios公司开发者账号申请分享攻略 好不容易终于申请下来了ios 公司开发者账号,真是一路艰辛和漫长啊,特别是对于远在大洋彼岸的大中华国家.以下我就分享一下这一路下来的经验,希望对于那些新手同仁们有所帮 ...
- 调节LED的亮度
虽然Devices Plus已经介绍过Arduino的多种应用和作品示例,但是了解相关基础知识对于任何项目的构建仍然是非常重要的!这次,我们将为您介绍Arduino电子制作的基础知识.此次的分享嘉宾是 ...
- 快速添加string value Refactor->android->Extract Android String 或按Ctrl+1 出现列表框选择Extract Android String 来进行String国际化
快速添加string value Refactor->android->Extract Android String或按Ctrl+1 出现列表框选择Extract Android Stri ...
- FFMPEG+SDL简单视频播放器——人脸检测
前言 最近突发奇想,给播放器加上一个人脸检测的功能(事情似乎朝着奇怪的方向发展了,谁家的播放器会需要去检测人脸啊!),主要的目的是为了学习opencv,尝试将ffmpeg和opencv融合在一起使用. ...
- Java服务总在半夜挂,背后的真相竟然是...
写在前面 最近有用户反馈测试环境Java服务总在凌晨00:00左右挂掉,用户反馈Java服务没有定时任务,也没有流量突增的情况,Jvm配置也合理,莫名其妙就挂了 问题排查 问题复现 为了复现该问题,写 ...
- 学习一下Java的ArrayList和contains函数和扩容机制
起因 在Leetcode上做题写了两种暴力解法,但是执行效率上不太一样. 时间上差很远,内存虽然差不多但是前者击败30%,后者击败94%.这两种解法区别是用一条ArrayList还是两条来存数据,所以 ...