宕機不是一件很好的事情,可能造成體驗停止、服務中斷,就像沒有人希望在取錢時遇到 atm 機藍屏一樣。但是,如果在損失發生時,程式沒有因為宕機而停止,那麼使用者將會付出更大的代價,這種代價可以是金錢、時間甚至生命。因此,宕機有時是一種合理的止損方法。
go 語言可以在程式中手動觸發宕機,讓程式崩潰,這樣開發者可以及時地發現錯誤,同時減少可能的損失。
go 語言程式在宕機時,會將堆疊和 goroutine 資訊輸出到控制台,所以宕機也可以方便地知曉發生錯誤的位置。如果在編譯時加入的除錯資訊甚至連崩潰現場的變數值、執行狀態都可以獲取,那麼如何觸發宕機呢?例如下面的**:
package main
func main()
**執行崩潰並輸出如下
panic: crash
goroutine 1 [running]:
main.main()
f:/src/tester/main.go:5 +0x6b
以上**中只用了乙個內建的函式 panic() 就可以造成崩潰,panic() 的宣告如下:
func panic(v inte***ce{})
panic() 的引數可以是任意型別,後文將提到的 recover 引數會接收從 panic() 中發出的內容。
regexp 是 go 語言的正規表示式包,正規表示式需要編譯後才能使用,而且編譯必須是成功的,表示正規表示式可用。
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()
f:/src/tester/main.go:8 +0x1a4
Go 30 宕機(panic) 程式終止執行
go語言的型別系統會在編譯時捕獲很多錯誤,但有些錯誤只能在執行時檢查,如陣列訪問越界 空指標引用等,這些執行時錯誤會引起宕機。宕機不是一件很好的事情,可能造成體驗停止 服務中斷,就像沒有人希望在取錢時遇到 atm 機藍屏一樣,但是,如果在損失發生時,程式沒有因為宕機而停止,那麼使用者將會付出更大的代...
go語言panic函式詳解
程式異常被叫做panic,直譯為執行時恐慌 當panic被丟擲異常後,如果我們沒有在程式中新增任何保護措施的話,程式就會列印出panic的詳細情況之後,終止執行 panic runtime error index out of range goroutine 1 running main.main ...
go 語言的宕機回覆(recover)
在go語言中,錯誤一般會由error觸發,但是如果比較嚴重的錯誤 通常是沒有恰當處理的error,也可是手動觸發 會造成panic。一旦主程式panic,會導致整個程式掛掉。如果這個錯誤不是那麼嚴重,我們希望程式可以繼續往下執行,而不是整個程式掛掉。用recover函式,對panic錯誤進行攔截,避...