正常的函數執行流程將立即終止,但函數中之前使用defer關鍵字延遲執行的語句將正常展開執行,之后該函數將返回到調用函數,并導致逐層向上執行panic()流程,直到所屬的goroutine中所有正在執行的函數將被終止。錯誤信息將被報告,包括panic()的參數類型interface()我們可以看到,panic可以接收任意類型的數據
panic(404)
panic("network borken")
panic("Error("file not exists")
recover函數用于終止錯誤處理流程。recover應該在defer關鍵字的函數中執行以有效截取錯誤處理流程
package main
import (
"fmt"
)
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Println("detail:", r)
}
}()
fmt.Println("before painc")
panic("error1")
panic("error2")
fmt.Println("after panic")
return
}
運行結果
before painc
detail: error1
package main
import (
"fmt"
)
func main() {
fmt.Println("before painc")
panic("error1")
panic("error2")
fmt.Println("after panic")
return
}
運行結果
before painc
panic: error1
goroutine 1 [running]:
main.main()
/home/kenmy/go/src/github.com/shadowsocks/shadowsocks-go/sample-config/panic.go:17 +0xdd
package main
import (
"fmt"
)
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Println("detail:", r)
}
}()
test()
fmt.Println("end")
return
}
func test() {
defer func() {
if r := recover(); r != nil {
fmt.Println("detail0:", r)
}
}()
fmt.Println("before painc")
panic("error1")
panic("error2")
fmt.Println("after panic")
}
運行結果
before painc
detail0: error1
end
package main
import (
"fmt"
)
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Println("detail:", r)
}
}()
test()
fmt.Println("middle")
panic("error3")
fmt.Println("end")
return
}
func test() {
defer func() {
if r := recover(); r != nil {
fmt.Println("detail0:", r)
}
}()
fmt.Println("before painc")
panic("error1")
panic("error2")
fmt.Println("after panic")
}
運行結果
before painc
detail0: error1
middle
detail: error3
package main
import (
"fmt"
)
func main() {
test()
fmt.Println("middle")
panic("error3")
fmt.Println("end")
return
}
func test() {
fmt.Println("before painc")
panic("error1")
panic("error2")
fmt.Println("after panic")
}
運行結果:
before painc
panic: error1
goroutine 1 [running]:
main.test()
/home/kenmy/go/src/github.com/shadowsocks/shadowsocks-go/sample-config/panic.go:20 +0xdd
main.main()
/home/kenmy/go/src/github.com/shadowsocks/shadowsocks-go/sample-config/panic.go:10 +0x26
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。