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\n", p)
        }
    }()
    panic(errors.New("An intended fatal error"))
}
将defer 匿名函数放在函数体的开始处,可以有效防止该函数及其下层调用中的代码引发运行时恐慌

口可以把运行时恐慌的携带值转换为error类型值,并当作常规结果返回给调用方。
    这样既阻止了恐慌的扩散,又传递了引起恐慌的原因。
口检查运行时恐慌携带值的类型,并根据类型做不同的后续动作,这样可以精确地
    控制程序的错误处理行为。
  

原文地址:https://www.cnblogs.com/zhouqi666/p/10284801.html

时间: 2024-10-30 02:49:39

golang错误处理机制:panic与recover的相关文章

【GoLang】panic defer recover 深入理解

先等我想清楚golang错误处理 为什么要这么设计的时候 再来更新... Golang这么时尚的语言是没有类似try..catch 这种异常处理机制,而是使用 panic 和 recover处理异常. 其实相当于python的raise. golang的异常处理组合 panic,defer,recover,跟java中的try catch finially是类似的. 但是从语言的用户体验来说,不怎么好. 但考虑到golang的场景基本是系统高性能层面的,这种精准错误处理应该减少那种后遗症bug.

GO_05_2:Golang 中 panic、recover、defer 的用法

 函数 defer 1. 它的执行方式类似其他语言中的折构函数,在函数体执行结束后按照调用顺序的 相反顺序 逐个执行 2. 即使函数发生 严重错误 也会被执行,类似于 java 中 try{...} catch(){} finally{} 结构的 finally 3. 支持匿名函数的调用 4. 常用于资源清理.文件关闭.解锁以及记录时间等善后操作 5. 通过与匿名函数配合可在 return 之后修改函数计算结果 6. 如果函数体内某个变量作为 defer 时匿名函数的参数,则在定义 defer

深入Go的错误处理机制使用

开篇词 程序运行过程中不可避免的发生各种错误,要想让自己的程序保持较高的健壮性,那么异常,错误处理是需要考虑周全的,每个编程语言提供了一套自己的异常错误处理机制,在Go中,你知道了吗?接下来我们一起看看Go的异常错误机制. Go错误处理,函数多返回值是前提 首先我们得明确一点,Go是支持多返回值的,如下,sum函数进行两个int型数据的求和处理,函数结果返回最终的和(z)以及入参(x,y),既然支持多返回值,同理,我们能否把错误信息返回呢?当然是可以的 func sum (x,y int) (i

Go语言圣经-Panic异常,Recover捕获异常习题

Go语言圣经-Panic异常1.当panic异常发生时,程序会中断运行,并立即执行在该goroutine中被延迟的函数(defer 机制)2.不是所有的panic异常都来自运行时,直接调用内置的panic函数也会引发panic异常:panic函数接受任何值作为参数.3.由于panic会引起程序的崩溃,因此panic一般用于严重错误,如程序内部的逻辑不一致,对于大部分漏洞,我们应该使用Go提供的错误机制,而不是panic4.为了方便诊断问题,runtime包允许输出堆栈信息 Go语言圣经-Reco

Go错误处理机制及自定义错误

错误处理机制: 先看一段代码:看看输出什么? package mainimport "fmt" func test() { num1 := 10 num2 := 0 res := num1 / num2 fmt.Println("res=",res)} func main() { test() fmt.Println("下面的代码和逻辑...")} 对上面代码的总结: 1)在默认情况下,当发生错误后(panic),程序就会退出(崩溃了) 2)如果

理解Defer、Panic和Recover

刚开始的时候理解如何使用Defer和Recover有一点怪异,尤其是使用了try/catch块的时候.有一种模式可以在Go中实现和try/catch语句块一样的效果.不过之前你需要先领会Defer.Panic和Recover的精髓. 首先你需要理解defer关键字的作用,请看如下的代码: package main import ( "fmt" ) func main() { test() } func minicError(key string) error { return fmt.

Go基础系列:defer、panic和recover

defer关键字 defer关键字可以让函数或语句延迟到函数语句块的最结尾时,即即将退出函数时执行,即便函数中途报错结束.即便已经panic().即便函数已经return了,也都会执行defer所推迟的对象. 例如: func main() { a() } func a() { println("in a") defer b() println("leaving a") //到了这里才会执行b() } func b() { println("in b&qu

go语言中使用defer、panic、recover处理异常

go语言中的异常处理,没有try...catch等,而是使用defer.panic.recover来处理异常. 1.首先,panic 是用来表示非常严重的不可恢复的错误的.在Go语言中这是一个内置函数,如果在程序中遇到异常,或者调用panic函数,程序会立即退出(除非recover).如下代码: package main import "fmt" func main() { a := 10 b := 0 c := a / b fmt.Println(c) } 程序的输出如下: ? de

error、panic、recover、panicking

错误处理:当程序处于错误状态可以用os.Exit(1)来中止运行自定义错误:err := errors.New("I am error")用fmt创建错误(和print一个样,它会创建一个自定义error,字符串就是格式化后的字符串)fmt.Errorf("math: square root of negative number %g", f) 运行时异常与panic 当发生运行时错误时,Go会触发运行时panic(例如数组下标越界) panic也可以从代码中初始化