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. 【读书笔记】Linux系统管理初学者指南读书笔记1——第1-2章

    本博客记录一下<Linux系统管理初学者指南>这本书的读书笔记,最近由于想做一些关于嵌入式的项目,所以需要对Linux系统进行学习,正好之前买过这本书,内容还可以,能作为入门阅读 第1章 ...

  2. C语言printf输出32位十六进制

    long c = 0X1DAB83; //十六进制数字 printf("c=%lx\n", c); //以十六进制形式输出(字母小写) printf("c=%lX\n&q ...

  3. APP的文件数据直传腾讯云COS实践

    简介 本文主要介绍基于腾讯云对象存储COS,如何快速实现一个app的文件直传功能.您的服务器上只需要生成和管理访问密钥,无需关心细节,文件数据都存放在腾讯云 COS 上. 架构说明 对于app应用,把 ...

  4. SHR常用f7[更新ing]

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

  5. js 时间 日期

    date.getYear(); // 获取当前年份(2 位) date.getFullYear(); // 获取完整的年份(4 位, 1970-????) date.getMonth(); // 获取 ...

  6. unity 发布WebGL版本找不到unity自带的类

    加载asset bundle的时候出现Could not produce class with ID XXX的错误 在asset 文件夹下建一个Link的XML,内容如下: <?xml vers ...

  7. WindowsServer2012搭建FTP服务器站点

    公司需要搭建一个FTP服务器给银行推送账单,这个文章整理的比较详细,可以参考 数据来源: https://blog.csdn.net/u010483330/article/details/125931 ...

  8. 数据脱敏java代码

    //前prefix后suffix脱敏 public static String idEncrypt(String number ,Integer prefix, Integer suffix) { i ...

  9. Appium自动化测试之键盘操作pressKeyCode()方法(Android特有)

    电话键 KEYCODE_CALL 拨号键 5 KEYCODE_ENDCALL 挂机键 6 KEYCODE_HOME 按键Home 3 KEYCODE_MENU 菜单键 82 KEYCODE_BACK ...

  10. Java-【大数处理】和【日期类】

    [大数类] BigInteger(整数) 和 BigDecimal(小数) 都是Java针对大数提供的类 常用方法: (1)加:add (2)减:subtract (3)乘:multiply (4)除 ...