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. Source Tree 1、解决打开闪退问题2、解决找不到项目的问题

    闪退问题主要做了两点 1.版本降到3.1.2 下载链接:Sourcetree Download Archives | Sourcetree 2.参考博客做出文件修改参考bigbig猿博客 新建json ...

  2. ubuntu的vsftpd

    先输入vsftp -v查看自己的ubuntu是不是已经安装了vsftpd 没有安装的样子 安装的样子 如果没有安装先安装,输入下面的东西 apt-get install vsftpd 进行安装,安装好 ...

  3. Dapper.FastCRUD与Dapper中的CustomPropertyTypeMap冲突

    在使用Dapper.NET时,由于生成的实体的属性与数据库表字段不同(如表字段叫USER_NAME,生成的对应的实体属性则为UserName). 这时需要使用Dapper中的CustomPropert ...

  4. vue的双向绑定规则

    vue提供了v-model双向绑定指令,用来辅助在不操作DOM的前提下,快速读取表单的数据 <!DOCTYPE html> <html lang="en"> ...

  5. 你能谈谈HashMap怎样解决hash冲突吗

    在Java编程语言中,最基本的结构就是两种,一种是数组,一种是模拟指针(引用),所有的数据结构都可以用这两个基本结构构造,HashMap也一样. 当程序试图将多个 key-value 放入 HashM ...

  6. vue v-model的原理

    关于v-model v-model 可以实现表单与data里的双向绑定 很多插件上可以在组件上使用v-model,他是如何实现的呢,其实v-model就是一个语法糖 <input v-model ...

  7. 记录一次echarts 中bar 定时跳跃并显示内容

    查看echarts api -----   https://www.echartsjs.com/zh/api.html#echarts 搜索 1.dispatchAction   执行的关键 2.hi ...

  8. linux修改网络

    如何修改ip 临时方法: ifconfig DIVICE IP netmask NETMASK 知识临时修改ip,重启或重启网络恢复 在一个网卡上设置多个ip ifconfig DEVICE:NUMB ...

  9. WEB攻击与防御技术 pikachu——XSS攻击加CSRF

    一.反射性xss(get) 登录pikachu选择xss模块,第一题,写了一下,发现输入长度不够,很简单,在前端改一下长度就可以使用了,这题就不做过多解释 或者直接在URL中进行写入,也是肥肠滴方便 ...

  10. Python基础数据类型-Tuple(元组)

    a = () b = (1) # 不是元组类型,是int型 c = (1,) # 只有一个元素的时候,要加逗号才能表示是元组 d = (1, 2, 3, 4, 5, 6, 1) print(type( ...