C語言中文網 目錄
首頁 > Go語言教程 > Go語言函數 閱讀:3,425

Go語言宕機(panic)——程序終止運行

宕機不是一件很好的事情,可能造成體驗停止、服務中斷,就像沒有人希望在取錢時遇到 ATM 機藍屏一樣。但是,如果在損失發生時,程序沒有因為宕機而停止,那么用戶將會付出更大的代價,這種代價可以是金錢、時間甚至生命。因此,宕機有時是一種合理的止損方法。

手動觸發宕機

Go 語言可以在程序中手動觸發宕機,讓程序崩潰,這樣開發者可以及時地發現錯誤,同時減少可能的損失。

Go 語言程序在宕機時,會將堆棧和 goroutine 信息輸出到控制臺,所以宕機也可以方便地知曉發生錯誤的位置。如果在編譯時加入的調試信息甚至連崩潰現場的變量值、運行狀態都可以獲取,那么如何觸發宕機呢?例如下面的代碼:
package main

func main() {
    panic("crash")
}
代碼運行崩潰并輸出如下:

panic: crash

goroutine 1 [running]:
main.main()
    F:/src/tester/main.go:5 +0x6b

以上代碼中只用了一個內建的函數 panic() 就可以造成崩潰,panic() 的聲明如下:
func panic(v interface{})
panic() 的參數可以是任意類型,后文將提到的 recover 參數會接收從 panic() 中發出的內容。

在運行依賴的必備資源缺失時主動觸發宕機

regexp 是 Go 語言的正則表達式包,正則表達式需要編譯后才能使用,而且編譯必須是成功的,表示正則表達式可用。

編譯正則表達式函數有兩種,具體如下:

1) func Compile(expr string) (*Regexp, error)

編譯正則表達式,發生錯誤時返回編譯錯誤,Regexp 為 nil,該函數適用于在編譯錯誤時獲得編譯錯誤進行處理,同時繼續后續執行的環境。

2) func MustCompile(str string) *Regexp

當編譯正則表達式發生錯誤時,使用 panic 觸發宕機,該函數適用于直接適用正則表達式而無須處理正則表達式錯誤的情況。

MustCompile 的代碼如下:
func MustCompile(str string) *Regexp {
    regexp, error := Compile(str)
    if error != nil {
        panic(`regexp: Compile(` + quote(str) + `): ` + error.Error())
    }
    return regexp
}
代碼說明如下:
  • 第 1 行,編譯正則表達式函數入口,輸入包含正則表達式的字符串,返回正則表達式對象。
  • 第 2 行,調用 Compile() 是編譯正則表達式的入口函數,該函數返回編譯好的正則表達式對象和錯誤。
  • 第 3 和第 4 行判斷如果有錯,則使用 panic() 觸發宕機。
  • 第 6 行,沒有錯誤時返回正則表達式對象。

手動宕機進行報錯的方式不是一種偷懶的方式,反而能迅速報錯,終止程序繼續運行,防止更大的錯誤產生。不過,如果任何錯誤都使用宕機處理,也不是一種良好的設計。因此應根據需要來決定是否使用宕機進行報錯。

在宕機時觸發延遲執行語句

當 panic() 觸發的宕機發生時,panic() 后面的代碼將不會被運行,但是在 panic() 函數前面已經運行過的 defer 語句依然會在宕機發生時發生作用,參考下面代碼:
package main

import "fmt"

func main() {
    defer fmt.Println("宕機后要做的事情1")
    defer fmt.Println("宕機后要做的事情2")
    panic("宕機")
}
代碼輸出如下:

宕機后要做的事情2
宕機后要做的事情1
panic: 宕機

goroutine 1 [running]:
main.main()
    F:/src/tester/main.go:8 +0x1a4

對代碼的說明:
  • 第 6 行和第 7 行使用 defer 語句延遲了 2 個語句。
  • 第 8 行發生宕機。

宕機前,defer 語句會優先被執行,由于第 7 行的 defer 后執行,因此會在宕機前,這個 defer 會優先處理,隨后才是第 6 行的 defer 對應的語句。這個特性可以用來在宕機發生前進行宕機信息處理。

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo