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
  • 相关阅读:
    Vsftpd 3.0.2 正式版发布
    Putdb WebBuilder 6.5 正式版本发布
    SoaBox 1.1.6 GA 发布,SOA 模拟环境
    pynag 0.4.6 发布,Nagios配置和插件管理
    Percona Playback 0.4,MySQL 负荷回放工具
    xombrero 1.3.1 发布,微型 Web 浏览器
    Hypertable 0.9.6.4 发布,分布式数据库
    libmemcached 1.0.11 发布
    CryptoHeaven 3.7 发布,安全邮件解决方案
    Android Activity生命周期
  • 原文地址:https://www.cnblogs.com/zhzhlong/p/9486794.html
Copyright © 2011-2022 走看看