go语言中的panic有什么作用?可能很多人对此没有深入了解过,故而小编总结了这篇文章,通过这文章的讲解,希望你能够收获更多知识。
panic
当遇到不可恢复的错误状态的时候,如数组访问越界、空指针引用等,这些运行时错误会引起panic异常。
golang中没有try ... catch...这类异常捕获语句,但是提供了panic和recover内建函数,用于抛出异常以及异常的捕获。
• panic、 recover 参数类型为 interface{},因此可抛出任何类型对象。
• 如果程序出现了致命的错误,导致整个程序无法进行下去,golang提供了panic函数,用来实现程序的退出。
• 当程序发生 panic 时,使用 recover 可以重新获得对该程序的控
制。
• 不是所有的panic异常都来自运行时,直接调用内置的panic函数也会引发panic异常
• panic函数接受任何值作为参数。
(1)panic的使用
①延迟调试中引发的错误,可被后续延迟调试捕获,但仅最后错误可被捕获。
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
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") }
看完上述内容,你们对go语言中的panic的作用有进一步的了解吗?如果还想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。