標籤:run 調用 控制器 消失 user span 絕對路徑 err index
panic(運行時恐慌)是一種只會在程式運行時才回拋出來的異常。在panic被拋出之後,如果沒有在程式裡添加任何保護措施的話,程式就會在列印出panic的詳情,終止運行。
舉個栗子
package mainfunc main() { s1 := []int{0, 1, 2, 3, 4} e5 := s1[5] _ = e5}
運行上面的代碼,會拋出panic
panic: runtime error: index out of rangegoroutine 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 +0x91main.caller1() /Users/haolin/GeekTime/Golang_Puzzlers/src/puzzlers/article19/q1/demo48.go:15 +0x66main.main() /Users/haolin/GeekTime/Golang_Puzzlers/src/puzzlers/article19/q1/demo48.go:9 +0x66exit status 2
【Go】Panic函數