zoukankan      html  css  js  c++  java
  • golang错误处理机制:panic与recover

    原文地址:http://www.niu12.com/article/14
    panic知识点
    package main
    
    import (
        "fmt"
        "github.com/pkg/errors"
    )
    
    func main() {
        outerFunc()
        fmt.Println(1)
    }
    
    func outerFunc()  {
        innerFunc()
    }
    
    func innerFunc()  {
        panic(errors.New("An intended fatal error"))
    }
    
    当调用innerFunc 函数中的panic函数后,innerFunc 的执行会被停止。
    紧接着,流程控制权会交回给调用方outerFunc函数。
    然后, outerFunc函数的执行也将被停止。运行时恐慌就这样沿着调用栈反方向进行传播,
    直至到达当前goroutine的调用栈的最顶层。-旦达到顶层,就意味着该goroutine调用栈
    中所有函数的执行都已经被停止了,程序已经崩溃。
    GO运行时系统也会调用panic() 函数
    recover
    运行时恐慌一旦被引发,就会向调用方传播直至程序崩溃。 Go 提供了专用于“拦截”
    运行时恐慌的内建函数 recover ,它可以使气前的程序从恐慌状态中恢复并重新获
    得流程控制权。 recover 函数被调川后,会返回一个 interfaoe { }类型的结果、
    如果当时的程序正处于运行时恐慌的状态,那么这个结果就会是非 nil 的。
    
    func innerFunc() {
        defer func() {
            if p := recover(); p != nil {
                fmt.Printf("Recovered panic:%s
    ", p)
            }
        }()
        panic(errors.New("An intended fatal error"))
    }
    将defer 匿名函数放在函数体的开始处,可以有效防止该函数及其下层调用中的代码引发运行时恐慌
    
    口可以把运行时恐慌的携带值转换为error类型值,并当作常规结果返回给调用方。
        这样既阻止了恐慌的扩散,又传递了引起恐慌的原因。
    口检查运行时恐慌携带值的类型,并根据类型做不同的后续动作,这样可以精确地
        控制程序的错误处理行为。
      
  • 相关阅读:
    移植spdylay到libcurl
    用到的C++标准库
    libcurl底层调用逻辑
    socket编程
    linux的一些机制Signal, Fork,
    openssl 编程
    对称加密,非对称加密
    ajax提交整个form表单
    一道基础的for语句js编译过程
    怎样将浏览器一句话变为文本编辑器
  • 原文地址:https://www.cnblogs.com/zhouqi666/p/10284801.html
Copyright © 2011-2022 走看看