Go_day06
Go基础语法
错误和异常
什么是错误error
错误是指可鞥出现问题的地方出现了问题,这种情况在预料之中
func main() {
//打开一个文件
file, err := os.Open("aaaa.txt") //file是获取file对象,err是获取 获取file的对象时产生的错误信息
if err != nil {
fmt.Println(err)
return
}
fmt.Println(file.Name())
}
func main() {
errInfo := errors.New("我是新创建的错误信息")
fmt.Println(errInfo)
fmt.Printf("%T\n", errInfo)
err := setAge(-2)
//判断err中是否有值,没有则没有必要输出了
if err != nil {
fmt.Println(err)
}
//Errorf含有参数的输出错误信息 会返回一个errors类型信息
err2 := fmt.Errorf("又是一个新创建的错误%d", 400)
fmt.Println(err2)
fmt.Printf("%T\n", err2)
}
func setAge(age int) error {
if age < 0 {
return errors.New("输入不合法")
}
fmt.Println(age)
return nil
}
error类型
error类型是一个接口类型
自定义接口
type MyErrors struct {
msg string
code int
}
func (e MyErrors) Error() string {
return fmt.Sprint("错误信息:", e.msg, "状态码:", e.code)
}
func test(i int) (int, error) {
if i != 0 {
return i, &MyErrors{"非零错误", 500}
}
return i, nil
}
func main() {
i, err := test(1)
if err != nil {
fmt.Println(err)
msgInfo, ok := err.(*MyErrors)
if ok {
fmt.Println(msgInfo.msg)
fmt.Println(msgInfo.code)
}
}
fmt.Println(i)
}
什么是异常panic
异常指本不应该出现问题的地方出现了问题,比如引用了空指针,这种情况在意料之外
为了防止异常被滥用,常常使用函数的返回值来返回错误。而不是用异常代替错误
panic
func main() {
defer fmt.Println("main1")
defer fmt.Println("main2")
test1(1)
fmt.Println("main4")
defer fmt.Println("main5")
}
func test1(num int) {
defer fmt.Println("test1")
defer fmt.Println("test2") //先入后出 我将先被输出出来
if num == 1 {
panic("异常异常,panic将终止程序")
}
fmt.Println("test3")
defer fmt.Println("test4")
}
- panic将直接终止程序 ,在painc后面的代码不会被执行
recover
- 和panic是好兄弟,就是处理panic 恢复代码的正常执行
- 但是revover必须要搭配defer执行
- recover只返回panic传递的值
func main() {
defer fmt.Println("main1")
defer fmt.Println("main2")
test1(1)
fmt.Println("main4")
defer fmt.Println("main5")
}
func test1(num int) {
defer func() {
msg := recover()
if msg != nil {
fmt.Println("msg:", msg, "开始恢复执行")
}
}()
defer fmt.Println("test1")
defer fmt.Println("test2") //先入后出 我将先被输出出来
if num == 1 {
panic("异常异常,panic将终止程序")
}
fmt.Println("test3")
defer fmt.Println("test4")
}
test2
test1
msg: 异常异常,panic将终止程序 开始恢复执行
main4
main5
main2
main1
一定要理解这里执行顺序
panic后下面的代码不会被执行 但被延迟执行的会先入后出的执行 所以main1最后
main2紧跟输出
Go_day06的更多相关文章
随机推荐
- Typora笔记收费的解决
现在的Typora收费了,但是官网还是可以找到历史版本 Typora在1.0版本之前的不收费!!! 所有只需要下载1.0版本之前的版本就可以解决 Windows历史版本地址:https://typor ...
- ios自动化测试学习
原文:https://blog.csdn.net/jinjiangongzuoshi/article/details/126552806 内测发布工具 fir.im 为开发者提供测试应用极速发布,应用 ...
- Software--电商平台系统--P3 Product Catalogy 商品目录模块
2018-01-15 15:25:20 商品目录 服务层 控制器层 ProductCate 服务层 Controller 控制器层
- etcd 基于ubuntu 20.04 部署集群
Etcd是Kubernetes集群中的一个十分重要的组件,用于保存集群所有的网络配置和对象的状态信息,K8S中所有持久化的状态信息都是以Key-Value的形式存储在etcd中,提供分布式协调服务.之 ...
- Linux 系统挂载 ntfs 移动硬盘无法写入的问题
linux 下挂载 ntfs 移动硬盘无法写入问题 在机房使用移动硬盘时发现无法写入硬盘,具体是 Ubuntu 21.04 ,移动硬盘是 SSD ,分区类型是 NTFS . 首先百度得知最优办法是安装 ...
- windows 系统的端口问题
netstat -ano 列出所有正在使用的端口netstat -aon|findstr "4300" 查询占用该端口的PIDtasklist|findstr "4464 ...
- java通信
RPC:同步 http webservice RMI:同步 RMI 是面向对象方式的 Java RPC . 类要extends java.rmi.Remote接口 JMS:异步 需要有消息队列 act ...
- Python 默认环境
查看pip默认安装目录 python -m site 查看已安装 pip list installed 查看安装位置 pip show PyMySQL
- maven install 报错 The POM for com.oracle:ojdbc6:jar:11.2.0.7.0 is missing, no dependency information available
The POM for com.oracle:ojdbc6:jar:11.1.0.7.0 is missing, no dependency information available The POM ...
- 一种基于Modbus的工业通信网关设计
近年来,随着工业自动化领域的发展,工业现场对网络的可靠性及成本有极高的要求.传统基于串口的工业网关可以满足工业现场的应用,但却要付出高额成本.一种基于 ModBus 设计的工业通信网关就走进人们的眼中 ...