zoukankan      html  css  js  c++  java
  • Golang错误处理函数defer、panic、recover、errors.New介绍

    1. 在默认情况下,当发生错误(panic)后,程序就会终止运行
    2. 如果发生错误后,可以捕获错误,并通知管理人员(邮件或者短信),程序还可以继续运行,这当然无可厚非
    3. errors.New("错误信息"),会返回一个error类型的值,表示一个错误
    4. panic内置函数,接收一个interface()类型的值(也就是任何值都可以)作为参数,可以接收error类型的变量,输出错误信息,并退出程序
    5. GO语言追求简洁优雅,GO语言不类似php支出try catch操作
    6. GO语言中引入的处理方式为:defer、panic、recover
    7. GO可以抛出一个panic异常。然后在defer中通过recover捕获异常再处理

    自定义错误处理运用

    package main
    import (
        "fmt"
        "errors"
    )
    
    
    //此函数读取配置文件信息
    //如果文件名不正确,返回自定义错误
    func readConfFile(FileName string) (err error) { //返回error类型
        if FileName == "config.ini" {
            return nil //表示没有错误
        } else {
            return errors.New("读取文件错误")
        }
    }
    
    func error_func(){
        err := readConfFile("config.ini")  //这里故意写错,报错代码在第一块,如果写对,在第二块
        if err != nil {
            //如果读取文件发生错误,就输出这个错误,并终止程序
            panic(err)  //这个函数作用是打印错误信息,并终止程序
        }
        fmt.Println("error_func()继续执行")
    }
    func main() {
        error_func()
        fmt.Printf("发生错误后面的代码")
    }
    
    
    
    //【报错信息】
    //一、
    // panic: 读取文件错误
    
    // goroutine 1 [running]:
    // main.error_func()
    //         D:/goproject/src/main/hello.go:22 +0xdf
    // main.main()
    //         D:/goproject/src/main/hello.go:27 +0x27
    // exit status 2
    
    
    //二、
    // error_func()继续执行
    // 发生错误后面的代码

    recover+defer的运用

    package main
    import (
        "fmt"
        "time"
    )
    
    
    
    //这里举例,在数学计算中0是不可以作为被除数的
    func error_func() {
        //这里使用defer + recover来捕获处理异常
        defer func() {  //defer就是把匿名函数压入到defer栈中,等到执行完毕后或者发生异常后调用匿名函数
            err := recover()  //recover是内置函数,可以捕获到异常
            if err != nil {   //说明有错误
                fmt.Println("err=", err)
                //当然这里可以把错误的详细位置发送给开发人员
                //send email to admin
            }
        }()
        num1 := 10
        num2 := 0
        res := num1 / num2
        fmt.Println("res=", res)
    }
    
    func main() {
        //这样程序不会轻易挂掉
        error_func()
        i := 0
        for {
            i++
            fmt.Println("发生错误后面的代码", i)
            time.Sleep(time.Second)
        }
    
    }

    defer语句是在return之后执行的,例如:

    func test() (result int) {
        defer func() {
            result = 12
        }()
        return 10
    }
    
    func main() {
        fmt.Println(test())     // 12
    }

    在一个函数中panic被调用后,其defer语句仍会执行,例如:

    package main
    import (
        "fmt"
        "errors"
    )
    
    
    func foo()(n int) {
        defer func() {
            if r := recover(); r != nil {
                fmt.Println("再然后④
    ")
                n++   
                fmt.Println("最后⑤
    ")
            }
        }()
        fmt.Println("首先①
    ")
        n++       
        fmt.Printf("然后②n=%v
    " ,n) 
        fmt.Println("然后③
    ")     
        panic(errors.New("i'm a bug"))  
        fmt.Println("没走
    ")
                
        return n
    }
    func main() {
        n := foo()
        fmt.Printf("n最后的值%v", n)
    }
    首先①
    然后②n=1
    然后③
    再然后④
    最后⑤
    n最后的值2
  • 相关阅读:
    Android开源图表图形库K线图
    交易所8种作死方式
    Android百大框架排行榜
    15类Android通用流行框架
    如何避免Scrum敏捷开发团队反思会形式化,海星法介绍
    2018年Android面试题含答案--适合中高级
    FCoin优势
    golang学习笔记16 beego orm 数据库操作
    金融系统中加密机的简介
    ESB(Enterprise Service Bus)企业服务总线介绍
  • 原文地址:https://www.cnblogs.com/wt645631686/p/9562997.html
Copyright © 2011-2022 走看看