Go 30 宕機(panic) 程式終止執行

2021-09-29 14:38:18 字數 2112 閱讀 1911

go語言的型別系統會在編譯時捕獲很多錯誤,但有些錯誤只能在執行時檢查,如陣列訪問越界、空指標引用等,這些執行時錯誤會引起宕機。

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

一般而言,當宕機發生時,程式會中斷執行,並立即執行在該 goroutine(可以先理解成執行緒)中被延遲的函式(defer 機制),隨後,程式崩潰並輸出日誌資訊,日誌資訊包括 panic value 和函式呼叫的堆疊跟蹤資訊,panic value 通常是某種錯誤資訊。

對於每個 goroutine,日誌資訊中都會有與之相對的,發生 panic 時的函式呼叫堆疊跟蹤資訊,通常,我們不需要再次執行程式去定位問題,日誌資訊已經提供了足夠的診斷依據,因此,在我們填寫問題報告時,一般會將宕機和日誌資訊一併記錄。

雖然go語言的 panic 機制類似於其他語言的異常,但 panic 的適用場景有一些不同,由於 panic 會引起程式的崩潰,因此 panic 一般用於嚴重錯誤,如程式內部的邏輯不一致。任何崩潰都表明了我們的**中可能存在漏洞,所以對於大部分漏洞,我們應該使用go語言提供的錯誤機制,而不是 panic。

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

go語言程式在宕機時,會將堆疊和 goroutine 資訊輸出到控制台,所以宕機也可以方便地知曉發生錯誤的位置,那麼我們要如何觸發宕機呢,示例**如下所示:

package main

func main()

**執行崩潰並輸出如下:

panic: crash

goroutine 1 [running]:

main.main()

d:/code/main.go:4 +0x40

exit status 2

以上**中只用了乙個內建的函式 panic() 就可以造成崩潰,panic() 的宣告如下:

func panic(v inte***ce{})    //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 

return regexp

}

**說明如下:

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

package main

import "fmt"

func main()

**輸出如下:

宕機後要做的事情2

宕機後要做的事情1

panic: 宕機

goroutine 1 [running]:

main.main()

d:/code/main.go:8 +0xf8

exit status 2

對**的說明:

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

go 語言的宕機回覆(recover)

在go語言中,錯誤一般會由error觸發,但是如果比較嚴重的錯誤 通常是沒有恰當處理的error,也可是手動觸發 會造成panic。一旦主程式panic,會導致整個程式掛掉。如果這個錯誤不是那麼嚴重,我們希望程式可以繼續往下執行,而不是整個程式掛掉。用recover函式,對panic錯誤進行攔截,避...

Go 30 Go 工廠模式

golang的結構體沒有建構函式,通常可以使用工廠模式來解決這個問題 需求 當我們在model中定義結構體時,當結構體名稱首字母大寫student 那麼可以跨包使用,但是要是小寫student,怎麼辦呢?這就需要使用工廠模式來解決 引包要從src的目錄下開始,src不用寫 示例 type stude...

go語言宕機(panic) 程式終止執行

宕機不是一件很好的事情,可能造成體驗停止 服務中斷,就像沒有人希望在取錢時遇到 atm 機藍屏一樣。但是,如果在損失發生時,程式沒有因為宕機而停止,那麼使用者將會付出更大的代價,這種代價可以是金錢 時間甚至生命。因此,宕機有時是一種合理的止損方法。go 語言可以在程式中手動觸發宕機,讓程式崩潰,這樣...