zoukankan      html  css  js  c++  java
  • Golang中的panic和recover(捕获异常)

    func panic(interface{})和func recover() interface{}是Golang中用于错误处理的两个函数。

    panic的作用就是抛出一条错误信息,从它的参数类型可以看到它可以抛出任意类型的错误信息。在函数执行过程中的某处调用了panic,则立即抛出一个错误信息,同时函数的正常执行流程终止,但是该函数中panic之前定义的defer语句将被依次执行。之后该goroutine立即停止执行。

    recover()用于将panic的信息捕捉。recover必须定义在panic之前的defer语句中。在这种情况下,当panic被触发时,该goroutine不会简单的终止,而是会执行在它之前定义的defer语句。

    下面是一个简单的例子:

    -->捕捉自己设置的panic错误:

    package main
    
    import "fmt"
    import "math"
    
    func foo(a int) {
        defer fmt.Println("foo退出来了")
    
        defer func() {
    
            if r := recover(); r != nil {
                fmt.Printf("捕获到的错误:%s
    ", r)
            }
        }()
    
        if a < 0 {
    
            panic("必须输入大于0的数")
        }
    
        fmt.Println("该数的方根为:", math.Sqrt(float64(a)))
    
    }
    
    func main() {
    
        var a int
        a = 10
        fmt.Printf("a=%d
    ", a)
        foo(a)
    
        var b int
        b = -10
        fmt.Printf("b=%d
    ", b)
        foo(b)
    
        fmt.Println("该goroutine还可以执行")
    }
    // ///////////
    a=10
    该数的方根为: 3.1622776601683795
    foo退出来了
    b=-10
    捕获到的错误:必须输入大于0的数
    foo退出来了
    该goroutine还可以执行
    
    Process finished with exit code 0

    ----

    --> 捕捉go语言内部的Panic错误:

    package main
    
    import "fmt"
    
    func foo() {
    
        defer func() {
    
            if r := recover(); r != nil {
                fmt.Printf("捕获到的错误:%s
    ", r)
            }
        }()
    
        var a, b int
    
        a, b = 1, 1
        c := 3/(a-b)
        fmt.Println(a, b, c)
    
    }
    
    func main() {
        foo()
    }
    
    //====
    捕获到的错误:runtime error: integer divide by zero
  • 相关阅读:
    SPU和SKU有什么区别
    Mave手动安装jar包
    maven国内镜像(国内oschina的maven服务器关了)
    用java代码将从数据库中取出的具有父子关系的数据转成json格式
    Oracle中的decode()函数
    Oracle中的instr()函数
    Oracle的nvl
    Oracle保留小数点后两位的几种方法
    【Python】djangorestframework 基于django框架的接口开发
    【MySQL】 GTID使用
  • 原文地址:https://www.cnblogs.com/zhzhlong/p/9486794.html
Copyright © 2011-2022 走看看