1. 程式人生 > >【Go】Panic函數

【Go】Panic函數

與此同時 沒有 異常 caller run 文件 絕對路徑 代碼 pre

  panic(運行時恐慌)是一種只會在程序運行時才回拋出來的異常。在panic被拋出之後,如果沒有在程序裏添加任何保護措施的話,程序就會在打印出panic的詳情,終止運行。

  舉個栗子

package main

func main() {
    s1 := []int{0, 1, 2, 3, 4}
    e5 := s1[5]
    _ = e5
}

  運行上面的代碼,會拋出panic

panic: runtime error: index out of range

goroutine 1 [running]:   //Id為1的goroutine在此panic被引發時正在運行
main.main()
 
/Users/haolin/GeekTime/Golang_Puzzlers/src/puzzlers/article19/q0/demo47.go:5 +0x3d //此行代碼在其所屬源碼文件中的行數,以及源碼文件的絕對路徑, +03d是計數偏移量,用處不大。 exit status 2 //以退出狀態碼2結束運行,一般狀態不為0時表示程序非正常退出

從Painc被引發到程序終止運行的大致過程是怎樣的?

  某個函數中的某行代碼引發了一個panic後,初始的panic詳情會被建立起來,並且該程序的控制器會立即從此行代碼轉移到調用其所屬函數的那行代碼上(調用棧中的上一級),此行代碼所屬函數的執行隨即終止。緊接著,控制權並不會在此有片刻停留,它又會立即轉移至上一級的調用代碼處,反方向傳播直至最外層函數(go函數,對於主goroutine來說就是main函數)。但是控制器也不會停留在那裏,而是被Go語言運行時系統收回。隨後程序奔潰並終止運行,承載程序這次運行的進程也會隨之死亡並消失。與此同時,在這個控制器傳播過程中,panic詳情會積累和完善,並在程序終止之前打印出來。

//main函數調用了caller1函數,caller1函數調用了caller2函數
goroutine 1 [running]:
main.caller2()
 /Users/haolin/GeekTime/Golang_Puzzlers/src/puzzlers/article19/q1/demo48.go:22 +0x91
main.caller1()
 /Users/haolin/GeekTime/Golang_Puzzlers/src/puzzlers/article19/q1/demo48.go:15 +0x66
main.main()
 /Users/haolin/GeekTime/Golang_Puzzlers/src/puzzlers/article19/q1/demo48.go:9
+0x66 exit status 2

【Go】Panic函數