日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Go的宕机与宕机恢复

發(fā)布時間:2024/3/7 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Go的宕机与宕机恢复 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

拜一拜,永不宕機

  • 宕機
    • 啥是宕機
    • 手動觸發(fā)宕機
  • 宕機恢復(fù)
      • ps
  • 你以為結(jié)束了

宕機

話說這是一個風(fēng)和日麗的上午,拿到了外賣小哥送來的我最心愛的麻辣燙,我打開了因為昨天剛充了三毛錢電費而恢復(fù)了使用的電腦,登上了滿是美女好友的微信,熟悉的聲音馬上響徹在了我這三百平米的臥室中,果然我的魅力無法讓人自拔,點開這閃爍的美女頭像,一行文字映入眼簾,項目出bug了,直接宕機了,五分鐘處理了,不然麻辣燙給你倒了…… 真好

跑題了……廢話不多說,上貨

啥是宕機

我認為go語言中的宕機和報錯差不多,數(shù)組訪問越界、空指針引用等,這些運行時錯誤都會引起宕機,宕機后程序就會停止,編譯器就會輸出對應(yīng)的報錯信息,包括 panic value 和函數(shù)調(diào)用的堆棧跟蹤信息,panic value 通常是某種錯誤信息
看上去宕機好像沒什么好處,但其實有時合理的宕機是一種非常明智的止損方式。

手動觸發(fā)宕機

類似其他語言,比如java手動 throw 一個 error 一樣,Go也有手動觸發(fā)宕機的方式——panic()

package mainimport "fmt" func main() {//xxxxxxxfmt.Println("我上面有一萬行代碼") panic("一萬行也沒用,我出毛病了")fmt.Println("我不好使了") }


Go語言程序在宕機時,會將堆棧和 goroutine 信息輸出到控制臺,所以宕機也可以方便地知曉發(fā)生錯誤的位置。上面就展示第7行發(fā)生了錯誤

如果我們想讓方法最后宕機,不導(dǎo)致其他語句的執(zhí)行可以使用defer

package mainimport "fmt" func main() {//xxxxxxxfmt.Println("我上面有一萬行代碼") defer panic("一萬行也沒用,我出毛病了")fmt.Println("哎,我又好使了") }


為什么會有兩個錯誤信息呢,因為defer會在當(dāng)前行加載,所以產(chǎn)生了第一次報錯,后在方法后進行執(zhí)行,產(chǎn)生了第二個報錯。

宕機恢復(fù)

如果我們想在宕機后仍讓程序繼續(xù)執(zhí)行,可以使用recover ,跟java中try/catch作用差不多,recover 僅在延遲函數(shù) defer 中有效,在正常的執(zhí)行過程中,調(diào)用 recover 會返回 nil 并且沒有其他任何效果,如果當(dāng)前的 goroutine 陷入恐慌,調(diào)用 recover 可以捕獲到 panic 的輸入值,并且恢復(fù)正常的執(zhí)行

package mainimport "fmt"func test () {defer func() {err := recover()if err != nil {fmt.Println("我說好使了你信不信") }}()//調(diào)用匿名函數(shù)demo () }func demo () {fmt.Println("一萬行也沒用,我出毛病了,下面都不好使") defer panic("我還能說啥,說啥都不好使了") } func main() {//xxxxxxxfmt.Println("我上面有一萬行代碼") test()fmt.Println("哎,我又好使了") }


panic 和 recover 的組合有如下特性:
有 panic 沒 recover,程序宕機。
有 panic 也有 recover,程序不會宕機,執(zhí)行完對應(yīng)的 defer 后,從宕機點退出當(dāng)前函數(shù)后繼續(xù)執(zhí)行。

ps

雖然 panic/recover 能模擬其他語言的異常機制,但并不建議在編寫普通函數(shù)時也經(jīng)常性使用這種特性
在 panic 觸發(fā)的 defer 函數(shù)內(nèi),可以繼續(xù)調(diào)用 panic,進一步將錯誤外拋,直到程序整體崩潰
如果想在捕獲錯誤時設(shè)置當(dāng)前函數(shù)的返回值,可以對返回值使用命名返回值方式直接進行設(shè)置

你以為結(jié)束了

搞明白了如何恢復(fù)宕機的我拿著recover直接將導(dǎo)致宕機的方法捕捉,然后上去就是一頓烏鴉坐飛機,這回大功告成,趕緊回復(fù)處理完了
不一會收到回復(fù),寫的什么玩意,你就這么處理的嘛,留的坑給誰填,不僅這個月麻辣燙沒了,下個月也沒了
真是美好的一天……

大家看完發(fā)現(xiàn)有什么錯誤,寫在下面吧!跟我黑虎阿福比劃比劃!

總結(jié)

以上是生活随笔為你收集整理的Go的宕机与宕机恢复的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。