久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長(zhǎng)資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      golang如何防止意外崩潰

      golang如何防止意外崩潰

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

      Go 沒(méi)有異常系統(tǒng),其使用 panic 觸發(fā)宕機(jī)類(lèi)似于其他語(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)行類(lèi)型斷言。

      第 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 沒(méi) recover,程序宕機(jī)。

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

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)