golang panic可以捕获标准错误吗


本文摘自php中文网,作者(*-*)浩,侵删。

panic (推荐学习:go)

当遇到不可恢复的错误状态的时候,如数组访问越界、空指针引用等,这些运行时错误会引起panic异常。

golang中没有try ... catch...这类异常捕获语句,但是提供了panic和recover内建函数,用于抛出异常以及异常的捕获。

? panic、 recover 参数类型为 interface{},因此可抛出任何类型对象。

? 如果程序出现了致命的错误,导致整个程序无法进行下去,golang提供了panic函数,用来实现程序的退出。

? 当程序发生 panic 时,使用 recover 可以重新获得对该程序的控

制。

? 不是所有的panic异常都来自运行时,直接调用内置的panic函数也会引发panic异常

? panic函数接受任何值作为参数。

(1)panic的使用

①延迟调试中引发的错误,可被后续延迟调试捕获,但仅最后错误可被捕获。

1

2

3

4

5

6

7

8

func test() {defer func() {

    fmt.Println(recover())

}()defer func() {

    panic("defer panic")

}()

    panic("test panic")

}func main() {

    test()    //defer panic}

②当函数发生 panic 时,它会终止运行,在执行完所有的延迟函数后,程序控制返回到该函数的调用方。这样的过程会一直持续下去,直到当前协程的所有函数都返回退出,然后程序会打印出 panic 信息,接着打印出堆栈跟踪,最后程序终止。

如果函数没有 panic,调用 recover 函数不会获取到任何信息,也不会影响当前进程。

demo

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

package mainimport (    "fmt")func fullName(firstName *string, lastName *string) {    if firstName == nil {

        panic("Firsr Name can't be null")

    }    if lastName == nil {

        panic("Last Name can't be null")

    }

    fmt.Printf("%s %s\n", *firstName, *lastName)

    fmt.Println("returned normally from fullName")

}func test(){

    defer fmt.Println("deferred call in test")

    firName := "paul"

    fullName(&firName, nil)

}func main() {

    defer fmt.Println("deferred call in main")

    test()

    fmt.Println("returned normally from main")

}

以上就是golang panic可以捕获标准错误吗的详细内容,更多文章请关注木庄网络博客!!

相关阅读 >>

golang不能发送udp广播

[go-linq]-go的.net linq式查询方法

新手入门golang开发的注意事项

go读书社区web开发与高性能架构优化

golang如何创建守护进程以及平滑重启

golang里的变量问题

golang与python有哪些不同?

golang找不到package怎么办

关于golang slice的append扩容

leetcode1047 删除字符串中的所有相邻重复项 golang

更多相关阅读请进入《golang》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...