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. php递归算法多级分类

    /** * 递归实现无限极分类 * @param $array 分类数据 * @param $pid 父ID * @param $level 分类级别 * @return $list 分好类的数组 直 ...

  2. 30.zookeeper部署

    (一)Zookeeper基础知识.体系结构.数据模型 1 zookeeper是一个类似linux.hdfs的树形文件结构,zookeeper可以用来保证数据在(zk)集群之间的数据的事务性一致. 2 ...

  3. 【ZYNQ学习】各个主题的值得看的博客

    在学习ZYNQ时会遇到不少问题,这时我们一方面要在DocNav找Xilinx的官方文档,另一方面要参考别人的一些记录的解决好的办法,我在学习的时候看到了不少大佬的博客,给我带来了很大帮助.在这篇博客, ...

  4. go中的Itoa、Atoi和iota

    1. strcov包中的 Itoa 和Atoi Itoa (用于将整数转换为字符串) 来源:早期c语言中没有string类型而是用字符数组array表示字符串,所以 Itoa 是缩写于Int to A ...

  5. MySQL索引 及 EXPLAIN

    1.索引长度计算: 1.索引字段,没有设置NOT NULL,则需要加一个字节. 2.定长字段:tinyiny占1个字节.int占4个字节.bitint占8个字节.date占3个字节.datetime占 ...

  6. Swift中 堆(heap)和栈(stack)的区别

    1.内存空间分为堆空间和栈空间 2.堆->引用类型(对象.函数.闭包)  栈->值类型(结构体.枚举.元组) 3.值类型赋值->深拷贝  引用类型赋值->浅拷贝 let a = ...

  7. sed编辑器

    sed sed是一个非交互式的流文本编辑器,可实现增删改查,广泛适用于shell脚本中 工作原理 sed每次只从文本或标准输入中读取一行数据,将其拷贝到一个编辑缓冲区,然后对其如同命令一般处理,并显示 ...

  8. 25 bootstrap--v3--datetimepicker时间选择器--应用

    在模板中引用响应的文件 比如: layout.html <link rel="stylesheet" href="{% static 'stark/plugins/ ...

  9. elementUI table 第一列值相等合并

    效果如下: 首先:在table上加:span-method="spanMethod" 其次: methods中加两个方法 dataPretreatment() { //表格数据列合 ...

  10. 使用Python实现给企业微信发送allure报告,并实现微信查看

    1.注册企业微信 搜索企业微信直接注册 2.创建应用 3.查看企业id.Secret.应用id.部门id 4.发送代码 import os import jenkins import requests ...