golang的异常处理

作者: CodingCode | 来源:发表于2018-05-25 15:23 被阅读45次

go语言是不支持异常的,go语言的设计者认为异常会被不成熟的程序员滥用,导致异常的处理过去复杂;go语言取消异常的一个替代办法是使用多返回值。

func foo(param1, param2, ...) (retval1, retval2, ...)

通常的函数实现里面,会使用一个error对象来表示是否成功,这其实类似于是否有异常发生

if val, err := foo(...); err != nil {
    // exception occured
}
// normal call flow

其实我个人觉得,像java语言的异常设计的已经比较合理了,完全可以保留使用,而不是丢弃;当然C++的异常是不完美的,是应该被禁用,因为C++的异常设计有本身的缺陷,主要是C++为了兼容C而导致的兼容性问题,历史包袱啊。

go语言的异常
go语言还是保留了一个异常处理的入口,那就是panic/recover/defer

作用如下

  • panic负责产生一个异常
  • defer里面t通过recover来捕获异常

panic是一个内置函数,原型定义如下:

func panic(v interface{})

recover也是一个内置函数,原型定义如下:

func recover() interface{}

panic的参数是一个interface类型,recover的返回值也是一个interface类型;其实panic()的参数正好就是recover()函数的返回值,就是这么传递过去的。

举例子来说:

package main

import (
    "fmt"
    "reflect"
)
func foo() {
    defer func() {
        if e := recover(); e != nil {
            fmt.Printf("recover type =[%v]\n\tvalue=[%v]\n", reflect.TypeOf(e), reflect.ValueOf(e))
        }
    }()
    panic(12)
}
func main() {
    foo()
}

运行结果:

recover type =[int]
        value=[12]

例子2:

package main

import (
    "fmt"
    "reflect"
)

func foo() {
    defer func() {
        if e := recover(); e != nil {
            fmt.Printf("recover type =[%v]\n\tvalue=[%v]\n", reflect.TypeOf(e), reflect.ValueOf(e))
        }
    }()
    panic(fmt.Errorf("meet an error"))
}

func main() {
    foo()
}

运行结果:

recover type =[*errors.errorString]
        value=[meet an error]

例子3:
这是一个异常链,也就是在一个function里面panic了,然后在上层caller里面捕获这个异常:

package main

import (
    "fmt"
    "reflect"
)

func foo() {
    panic("error in foo")
}

func main() {
    defer func() {
        if e := recover(); e != nil {
            fmt.Printf("recover type =[%v]\n\tvalue=[%v]\n", reflect.TypeOf(e), reflect.ValueOf(e))
        }
    }()

    foo()
}

运行

recover type =[string]
        value=[error in foo]

我们看到异常发生在foo()函数里面,但是捕获这个异常的是在main()函数里面。

相关文章

  • goLang异常处理

    defer defer是go提供的一种资源处理的方式。defer的用法遵循3个原则在defer表达式被运算的同时,...

  • golang异常处理

    go语言没有使用像java python等语言的try catch/except 语句来处理异常,而是使用它特有的...

  • Golang异常处理

    Go中可以抛出一个panic的异常,然后在defer中通过recover捕获这个异常,然后正常处理。异常和错误是不...

  • golang的异常处理

    go语言是不支持异常的,go语言的设计者认为异常会被不成熟的程序员滥用,导致异常的处理过去复杂;go语言取消异常的...

  • Golang的异常处理

    Golang的异常处理 Golang的优点有很多,以前的文章中也有提到过,但也有很多槽点为Gopher所诟病,尤其...

  • golang笔记——异常处理

    函数返回值处理异常 golang为了避免像写Java一样滥用try catch,可以使用函数多返回值的特性来进行异...

  • Golang的异常处理介绍

  • 【Golang】并发的异常处理

    go语言的并发实现起来很简单,只需要一个go关键字即可使函数并发,但是捕捉并发方法中的错误就没有那么方便了。本文总...

  • golang 基础(33)异常处理

    对出初学者往往忽视程序中异常处理,认为程序总是是在一个被百般呵护的环境运行,没有任何风吹雨打,这是因为我们是最了解...

  • 16-Go语言异常处理

    异常处理 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常 golang中提供了...

网友评论

本文标题:golang的异常处理

本文链接:https://www.haomeiwen.com/subject/yvxujftx.html