最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解golang的異常處理機制

 更新時間:2017年07月19日 08:38:27   作者:Dr_Zhang  
Go語言追求簡潔優(yōu)雅,所以,Go語言不支持傳統(tǒng)的 try…catch…finally 這種異常,下面這篇文章主要給大家介紹了關(guān)于golang的異常處理機制,需要的朋友可以參考借鑒,下面來一起看看吧。

前言

眾所周知在java或php等很多面向?qū)ο蟮恼Z言中, 異常處理是依靠throw、catch來進行的。在go語言中,panic和recover函數(shù)在作用層面分別對等throw和catch語句,當然也存在不同之處。下面話不多說,來一起看看詳細的介紹吧。

從設(shè)計層面來看,panic和recover函數(shù)適用于那些真正的異常(例如整數(shù)除0),而throw catch finally機制常常被用來處理一些業(yè)務(wù)層面的自定義異常。因此在go語言中,panic和recover要慎用。

上述兩種異常機制的使用中,在處理異常時控制流程的走向也是相似的。

下面將分別舉例說明:

try catch finally機制

 try{
 throw new Exception();
 } catch(Exception $e) {
 do something ...
 } finally {
 
 }

這種機制中,我們把可能拋出異常的語句或拋出自定義異常的語句放置到try語句塊中,而在catch塊中,我們將上述語句拋出的異常捕獲,針對不同的異常進行報警或log等處理。之后,控制流程進入到finally語句塊中。若沒有finally語句,控制流程將進入到catch之后的語句中。也就是說,在這種機制中,控制流程是轉(zhuǎn)移到同一層級中異常捕獲之后的語句中。

panic recover defer機制

在go的異常機制中,panic可以將原有的控制流程中斷,進入到一個"恐慌"流程。這種恐慌流程可以顯式調(diào)用panic()函數(shù)產(chǎn)生或者由運行時錯誤產(chǎn)生(例如訪問越界的數(shù)組下標)。panic會在調(diào)用它的函數(shù)中向本層和它的所有上層逐級拋出,若一直沒有recover將其捕獲,程序退出后會產(chǎn)生crash;若在某層defer語句中被recover捕獲,控制流程將進入到recover之后的語句中。

 /* example 1 */
 package main
 import (
 "fmt"
 )

 func f() {
 defer func() {
  fmt.Println("b")
  if err := recover();err != nil {
  fmt.Println(err)
  }
  fmt.Println("d")
 }()
 fmt.Println("a")
 panic("a bug occur")
 fmt.Println("c")
 }

 func main() {
 f()
 fmt.Println("x")
 }

在上述舉例中,輸出結(jié)果為:

 a
 b
 a bug occur
 d
 x

這說明,在f函數(shù)中拋出的panic被自己defer語句中的recover捕獲,然后控制流程進入到recover之后的語句中,即打印d、打印x,之后進程正常退出。

 /* example 2 */
 package main
 import (
  "fmt"
 )

 func g() {
  defer func() {
   fmt.Println("b")
   if err := recover();err != nil {
    fmt.Println(err)
   }
   fmt.Println("d")
  }()
  f()
  fmt.Println("e")
 }

 func f() {
  fmt.Println("a")
  panic("a bug occur")
  fmt.Println("c")
 }

 func main() {
  g()
  fmt.Println("x")
 }

上述案例的輸出結(jié)果是:

 a
 b
 a bug occur
 d
 x

進程經(jīng)歷了這樣一個過程:f()中拋出panic,由于自身沒有定義defer語句,panic被拋到g()中。g()的defer語句中定義了recover,捕獲panic后并執(zhí)行完defer剩余的語句,之后控制流程被轉(zhuǎn)交到main()函數(shù)中,直至進程結(jié)束。

總結(jié)

以上就是這篇文章的全部內(nèi)容,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • 使用Viper處理Go應(yīng)用程序的配置方法

    使用Viper處理Go應(yīng)用程序的配置方法

    Viper是一個應(yīng)用程序配置解決方案,用于Go應(yīng)用程序,它支持JSON、TOML、YAML、HCL、envfile和Java properties配置文件格式,這篇文章主要介紹了使用Viper處理Go應(yīng)用程序的配置,需要的朋友可以參考下
    2023-09-09
  • 一文搞懂Go?Exec?僵尸與孤兒進程

    一文搞懂Go?Exec?僵尸與孤兒進程

    本文主要介紹了Go?Exec?僵尸與孤兒進程,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Golang實現(xiàn)快速求冪的方法詳解

    Golang實現(xiàn)快速求冪的方法詳解

    這篇文章主要為大家詳細介紹了如何利用Golang實現(xiàn)快速求冪,文中的示例代碼講解詳細,對我們學習或工作有一定參考價值,需要的可以參考一下
    2022-06-06
  • Go+Redis實現(xiàn)延遲隊列實操

    Go+Redis實現(xiàn)延遲隊列實操

    這篇文章主要介紹了Go+Redis實現(xiàn)延遲隊列實操,延遲隊列是一種非常使用的數(shù)據(jù)結(jié)構(gòu),我們經(jīng)常有需要延遲推送處理消息的場景,比如延遲60秒發(fā)送短信,延遲30分鐘關(guān)閉訂單,消息消費失敗延遲重試等
    2022-09-09
  • Go語言實現(xiàn)熱更新具體步驟

    Go語言實現(xiàn)熱更新具體步驟

    這篇文章主要為大家介紹了Go語言實現(xiàn)熱更新具體步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • go語言制作端口掃描器

    go語言制作端口掃描器

    本文給大家分享的是使用go語言編寫的TCP端口掃描器,可以選擇IP范圍,掃描的端口,以及多線程,有需要的小伙伴可以參考下。
    2015-03-03
  • golang 通過ssh代理連接mysql的操作

    golang 通過ssh代理連接mysql的操作

    這篇文章主要介紹了golang 通過ssh代理連接mysql的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go語言刪除文本文件中的指定行操作代碼

    Go語言刪除文本文件中的指定行操作代碼

    假設(shè)現(xiàn)在有一個文本文件,我們需要刪除文件中亂碼的行。我們可以使用go的os庫來處理文件,遍歷整個文件然后將除過亂碼的行寫入一個新文件,以此來實現(xiàn)我們的需求,這篇文章主要介紹了Go語言刪除文本文件中的指定行,需要的朋友可以參考下
    2023-12-12
  • Golang算法之田忌賽馬問題實現(xiàn)方法分析

    Golang算法之田忌賽馬問題實現(xiàn)方法分析

    這篇文章主要介紹了Golang算法之田忌賽馬問題實現(xiàn)方法,結(jié)合具體實例形式分析了基于Go語言的田忌賽馬問題原理與算法實現(xiàn)技巧,需要的朋友可以參考下
    2017-02-02
  • Golang?統(tǒng)計字符串中數(shù)字字母數(shù)量的實現(xiàn)方法

    Golang?統(tǒng)計字符串中數(shù)字字母數(shù)量的實現(xiàn)方法

    這篇文章主要介紹了Golang?統(tǒng)計字符串中數(shù)字字母數(shù)量,本文給出了兩種從字符串獲取數(shù)字與字母數(shù)量的方法,分別是ASCII 碼值和正則表達式,需要的朋友可以參考下
    2022-06-06

最新評論

神池县| 大方县| 柳河县| 东港市| 临颍县| 长沙市| 鹤峰县| 石渠县| 沧州市| 元阳县| 东乡| 高要市| 衡阳市| 大名县| 抚顺市| 抚顺市| 辉南县| 泾源县| 五原县| 永靖县| 青冈县| 万安县| 巴里| 弋阳县| 太原市| 突泉县| 南岸区| 辉南县| 洪湖市| 渝中区| 金湖县| 涪陵区| 义马市| 邛崃市| 西宁市| 新营市| 遂平县| 息烽县| 小金县| 夏河县| 江川县|