Go的宕机与宕机恢复
拜一拜,永不宕機
- 宕機
- 啥是宕機
- 手動觸發宕機
- 宕機恢復
- ps
- 你以為結束了
宕機
話說這是一個風和日麗的上午,拿到了外賣小哥送來的我最心愛的麻辣燙,我打開了因為昨天剛充了三毛錢電費而恢復了使用的電腦,登上了滿是美女好友的微信,熟悉的聲音馬上響徹在了我這三百平米的臥室中,果然我的魅力無法讓人自拔,點開這閃爍的美女頭像,一行文字映入眼簾,項目出bug了,直接宕機了,五分鐘處理了,不然麻辣燙給你倒了…… 真好
跑題了……廢話不多說,上貨
啥是宕機
我認為go語言中的宕機和報錯差不多,數組訪問越界、空指針引用等,這些運行時錯誤都會引起宕機,宕機后程序就會停止,編譯器就會輸出對應的報錯信息,包括 panic value 和函數調用的堆棧跟蹤信息,panic value 通常是某種錯誤信息
看上去宕機好像沒什么好處,但其實有時合理的宕機是一種非常明智的止損方式。
手動觸發宕機
類似其他語言,比如java手動 throw 一個 error 一樣,Go也有手動觸發宕機的方式——panic()
package mainimport "fmt" func main() {//xxxxxxxfmt.Println("我上面有一萬行代碼") panic("一萬行也沒用,我出毛病了")fmt.Println("我不好使了") }
Go語言程序在宕機時,會將堆棧和 goroutine 信息輸出到控制臺,所以宕機也可以方便地知曉發生錯誤的位置。上面就展示第7行發生了錯誤
如果我們想讓方法最后宕機,不導致其他語句的執行可以使用defer
package mainimport "fmt" func main() {//xxxxxxxfmt.Println("我上面有一萬行代碼") defer panic("一萬行也沒用,我出毛病了")fmt.Println("哎,我又好使了") }
為什么會有兩個錯誤信息呢,因為defer會在當前行加載,所以產生了第一次報錯,后在方法后進行執行,產生了第二個報錯。
宕機恢復
如果我們想在宕機后仍讓程序繼續執行,可以使用recover ,跟java中try/catch作用差不多,recover 僅在延遲函數 defer 中有效,在正常的執行過程中,調用 recover 會返回 nil 并且沒有其他任何效果,如果當前的 goroutine 陷入恐慌,調用 recover 可以捕獲到 panic 的輸入值,并且恢復正常的執行。
package mainimport "fmt"func test () {defer func() {err := recover()if err != nil {fmt.Println("我說好使了你信不信") }}()//調用匿名函數demo () }func demo () {fmt.Println("一萬行也沒用,我出毛病了,下面都不好使") defer panic("我還能說啥,說啥都不好使了") } func main() {//xxxxxxxfmt.Println("我上面有一萬行代碼") test()fmt.Println("哎,我又好使了") }
panic 和 recover 的組合有如下特性:
有 panic 沒 recover,程序宕機。
有 panic 也有 recover,程序不會宕機,執行完對應的 defer 后,從宕機點退出當前函數后繼續執行。
ps
雖然 panic/recover 能模擬其他語言的異常機制,但并不建議在編寫普通函數時也經常性使用這種特性
在 panic 觸發的 defer 函數內,可以繼續調用 panic,進一步將錯誤外拋,直到程序整體崩潰
如果想在捕獲錯誤時設置當前函數的返回值,可以對返回值使用命名返回值方式直接進行設置
你以為結束了
搞明白了如何恢復宕機的我拿著recover直接將導致宕機的方法捕捉,然后上去就是一頓烏鴉坐飛機,這回大功告成,趕緊回復處理完了
不一會收到回復,寫的什么玩意,你就這么處理的嘛,留的坑給誰填,不僅這個月麻辣燙沒了,下個月也沒了
真是美好的一天……
大家看完發現有什么錯誤,寫在下面吧!跟我黑虎阿福比劃比劃!
總結
以上是生活随笔為你收集整理的Go的宕机与宕机恢复的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: EMI及其抑制方法
- 下一篇: vc驿站视频教程笔记4 Cstring