中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

golang出現(xiàn)意外崩潰應(yīng)該怎么辦-創(chuàng)新互聯(lián)

今天小編給大家分享的是golang出現(xiàn)意外崩潰應(yīng)該怎么辦,很多人都不太了解,今天小編為了讓大家更加了解golang出現(xiàn)意外崩潰該怎么辦,所以給大家總結(jié)了以下內(nèi)容,一起往下看吧。一定會(huì)有所收獲的哦。golang出現(xiàn)意外崩潰應(yīng)該怎么辦

成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),銅山企業(yè)網(wǎng)站建設(shè),銅山品牌網(wǎng)站建設(shè),網(wǎng)站定制,銅山網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,銅山網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

無(wú)論是代碼運(yùn)行錯(cuò)誤由 Runtime 層拋出的 panic 崩潰,還是主動(dòng)觸發(fā)的 panic 崩潰,都可以配合 defer 和 recover 實(shí)現(xiàn)錯(cuò)誤捕捉和恢復(fù),讓代碼在發(fā)生崩潰后允許繼續(xù)運(yùn)行。

Go 沒有異常系統(tǒng),其使用 panic 觸發(fā)宕機(jī)類似于其他語(yǔ)言的拋出異常,那么 recover 的宕機(jī)恢復(fù)機(jī)制就對(duì)應(yīng) try/catch 機(jī)制。

讓程序在崩潰時(shí)繼續(xù)執(zhí)行

下面的代碼實(shí)現(xiàn)了 ProtectRun() 函數(shù),該函數(shù)傳入一個(gè)匿名函數(shù)或閉包后的執(zhí)行函數(shù),當(dāng)傳入函數(shù)以任何形式發(fā)生 panic 崩潰后,可以將崩潰發(fā)生的錯(cuò)誤打印出來(lái),同時(shí)允許后面的代碼繼續(xù)運(yùn)行,不會(huì)造成整個(gè)進(jìn)程的崩潰。

保護(hù)運(yùn)行函數(shù):

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

對(duì)代碼的說(shuō)明:

第 9 行聲明描述錯(cuò)誤的結(jié)構(gòu)體,成員保存錯(cuò)誤的執(zhí)行函數(shù)。

第 17 行使用 defer 將閉包延遲執(zhí)行,當(dāng) panic 觸發(fā)崩潰時(shí),ProtectRun() 函數(shù)將結(jié)束運(yùn)行,此時(shí) defer 后的閉包將會(huì)發(fā)生調(diào)用。

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

第 22 行,使用 switch 對(duì) err 變量進(jìn)行類型斷言。

第 23 行,如果錯(cuò)誤是有 Runtime 層拋出的運(yùn)行時(shí)錯(cuò)誤,如空指針訪問(wèn)、除數(shù)為 0 等情況,打印運(yùn)行時(shí)錯(cuò)誤。

第 25 行,其他錯(cuò)誤,打印傳遞過(guò)來(lái)的錯(cuò)誤數(shù)據(jù)。

第 44 行,使用 panic 手動(dòng)觸發(fā)一個(gè)錯(cuò)誤,并將一個(gè)結(jié)構(gòu)體附帶信息傳遞過(guò)去,此時(shí),recover 就會(huì)獲取到這個(gè)結(jié)構(gòu)體信息,并打印出來(lái)。

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

panic和recover的關(guān)系

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

有 panic 沒 recover,程序宕機(jī)。

有 panic 也有 recover 捕獲,程序不會(huì)宕機(jī)。執(zhí)行完對(duì)應(yīng)的 defer 后,從宕機(jī)點(diǎn)退出當(dāng)前函數(shù)后繼續(xù)執(zhí)行。

關(guān)于golang出現(xiàn)意外崩潰應(yīng)該怎么辦就分享到這里了,當(dāng)然并不止以上和大家分析的辦法,不過(guò)小編可以保證其準(zhǔn)確性是絕對(duì)沒問(wèn)題的。希望以上內(nèi)容可以對(duì)大家有一定的參考價(jià)值,可以學(xué)以致用。如果喜歡本篇文章,不妨把它分享出去讓更多的人看到。

新聞標(biāo)題:golang出現(xiàn)意外崩潰應(yīng)該怎么辦-創(chuàng)新互聯(lián)
文章來(lái)源:http://www.rwnh.cn/article36/cejhpg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站標(biāo)簽優(yōu)化、網(wǎng)站維護(hù)、定制開發(fā)網(wǎng)站收錄、網(wǎng)站導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)
陵川县| 正安县| 桂平市| 淮滨县| 福泉市| 溆浦县| 仙居县| 遵义县| 章丘市| 大安市| 哈密市| 渝中区| 普兰县| 杭锦后旗| 大同市| 湛江市| 新蔡县| 阳城县| 清流县| 阜新市| 铜陵市| 会理县| 海门市| 林芝县| 汝城县| 甘孜县| 阿拉善左旗| 镇雄县| 资溪县| 鲁山县| 南乐县| 磐石市| 鄂托克旗| 汤阴县| 常宁市| 渝北区| 乐亭县| 南岸区| 定陶县| 东宁县| 定襄县|