中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

golang出現意外崩潰應該怎么辦

發布時間:2020-03-31 15:49:33 來源:億速云 閱讀:966 作者:小新 欄目:編程語言

今天小編給大家分享的是golang出現意外崩潰應該怎么辦,很多人都不太了解,今天小編為了讓大家更加了解golang出現意外崩潰該怎么辦,所以給大家總結了以下內容,一起往下看吧。一定會有所收獲的哦。golang出現意外崩潰應該怎么辦

無論是代碼運行錯誤由 Runtime 層拋出的 panic 崩潰,還是主動觸發的 panic 崩潰,都可以配合 defer 和 recover 實現錯誤捕捉和恢復,讓代碼在發生崩潰后允許繼續運行。

Go 沒有異常系統,其使用 panic 觸發宕機類似于其他語言的拋出異常,那么 recover 的宕機恢復機制就對應 try/catch 機制。

讓程序在崩潰時繼續執行

下面的代碼實現了 ProtectRun() 函數,該函數傳入一個匿名函數或閉包后的執行函數,當傳入函數以任何形式發生 panic 崩潰后,可以將崩潰發生的錯誤打印出來,同時允許后面的代碼繼續運行,不會造成整個進程的崩潰。

保護運行函數:

package main
 
import (
"fmt"
"runtime"
)
 
// 崩潰時需要傳遞的上下文信息
type panicContext struct {
function string // 所在函數
}
 
// 保護方式允許一個函數
func ProtectRun(entry func()) {
 
// 延遲處理的函數
defer func() {
 
// 發生宕機時,獲取panic傳遞的上下文并打印
err := recover()
 
switch err.(type) {
case runtime.Error: // 運行時錯誤
fmt.Println("runtime error:", err)
default: // 非運行時錯誤
fmt.Println("error:", err)
}
 
}()
 
entry()
 
}
 
func main() {
fmt.Println("運行前")
 
// 允許一段手動觸發的錯誤
ProtectRun(func() {
 
fmt.Println("手動宕機前")
 
// 使用panic傳遞上下文
panic(&panicContext{
"手動觸發panic",
})
 
fmt.Println("手動宕機后")
})
 
// 故意造成空指針訪問錯誤
ProtectRun(func() {
 
fmt.Println("賦值宕機前")
 
var a *int
*a = 1
 
fmt.Println("賦值宕機后")
})
 
fmt.Println("運行后")
}

對代碼的說明:

第 9 行聲明描述錯誤的結構體,成員保存錯誤的執行函數。

第 17 行使用 defer 將閉包延遲執行,當 panic 觸發崩潰時,ProtectRun() 函數將結束運行,此時 defer 后的閉包將會發生調用。

第 20 行,recover() 獲取到 panic 傳入的參數。

第 22 行,使用 switch 對 err 變量進行類型斷言。

第 23 行,如果錯誤是有 Runtime 層拋出的運行時錯誤,如空指針訪問、除數為 0 等情況,打印運行時錯誤。

第 25 行,其他錯誤,打印傳遞過來的錯誤數據。

第 44 行,使用 panic 手動觸發一個錯誤,并將一個結構體附帶信息傳遞過去,此時,recover 就會獲取到這個結構體信息,并打印出來。

第 57 行,模擬代碼中空指針賦值造成的錯誤,此時會由 Runtime 層拋出錯誤,被 ProtectRun() 函數的 recover() 函數捕獲到。

panic和recover的關系

panic 和 defer 的組合有如下特性:

有 panic 沒 recover,程序宕機。

有 panic 也有 recover 捕獲,程序不會宕機。執行完對應的 defer 后,從宕機點退出當前函數后繼續執行。

關于golang出現意外崩潰應該怎么辦就分享到這里了,當然并不止以上和大家分析的辦法,不過小編可以保證其準確性是絕對沒問題的。希望以上內容可以對大家有一定的參考價值,可以學以致用。如果喜歡本篇文章,不妨把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

湾仔区| 海伦市| 从江县| 东丰县| 江孜县| 西安市| 宁南县| 昭苏县| 名山县| 丽水市| 扎兰屯市| 永昌县| 河东区| 江安县| 应城市| 吐鲁番市| 闽清县| 宜君县| 宁夏| 桃江县| 祥云县| 高尔夫| 肇源县| 阜新市| 祁门县| 吉水县| 广昌县| 龙江县| 青田县| 南通市| 绍兴县| 陵川县| 平泉县| 延长县| 象州县| 抚州市| 哈尔滨市| 阜康市| 社旗县| 淮阳县| 乌恰县|