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的更多相关文章

随机推荐

  1. Vite项目打包配置详解

    一:vite构建项目 配置base 1.base配置打包公共路径 打开package.json 做项目时可以不去掉 好了,在以上你构建了vite,并配置了最简单的操作后,你准备配置vite.confi ...

  2. SHR常用f7[更新ing]

    <field id="unit" name="unit" label="单位" dataType="F7" uip ...

  3. mysql命令行添加用户并赋予权限

    mysql> create user 'admin'@'%' identified by '123456';Query OK, 0 rows affectedmysql> FLUSH PR ...

  4. golang json化时允许赋予默认值

    演示omitempty 代码: package main import ( "encoding/json" "fmt" ) func main() { type ...

  5. docker 中搭建 mysql pxc 集群

      一.docker中创建pxc 容器 1.拉取PXC 镜像 pull docker pull percona/percona-xtradb-cluster:5.7.21 2.更改镜像名称为pxc t ...

  6. 教你三分钟开发开发java短信验证码

    现如今,绝大多数网站和app都需要支持手机号注册.手机登录,这就需要开发者实现短信验证码的功能,对于很多小白同学来说,没接触过,没有思路,下面小编就给大家详解一下. 发送短信的功能需要借助第三方的短信 ...

  7. 给定两个字符串,均只包含英文字母,需区分大小写,一个是源字符串SS(长度<1000), 另一个是目标字符串TS(长度<1000),请问能否通过删除SS中的字符(不改变顺序)将它变换成TS,如果可以输出“YES",不可以则输出“NO"。 输入说明:第一行为源字符串SS,第二行为目标字符串TS。

    import java.util.Scanner;/*    给定两个字符串,均只包含英文字母,需区分大小写,一个是源字符串SS(长度<1000),    另一个是目标字符串TS(长度<1 ...

  8. libevent学习之入门--[01]概述与安装

    网上关于libevent的介绍不在少数,我相信目前看到我这篇博客时已经基本了解libevent是用来做什么的,有什么功能,在此就不重复介绍了.我会按照我学习的过程来完整记录整个库的所有核心内容和具体应 ...

  9. snorkel SentenceNgramViewer 标记时出现 Integrity Error

    Snorkel使用SQLAlchemy作为数据管理工具,在本地会生成一个.db文件,现有操作与.db文件中已有的记录重复,违反了数据库主键不能重复的性质 解决方式: You can load a la ...

  10. vue后台管理系统

    1. 项目概述: 根据不同的应用场景,电商系统一般都提供了 PC 端.移动 APP.移动 Web.微信小程序等多种终端访问方式. 2. 电商后台管理系统的功能 电商后台管理系统用于管理用户账号.商品分 ...