搜尋
首頁後端開發Golanggo語言的異常處理介紹

go語言的異常處理介紹

Nov 27, 2019 pm 03:57 PM
go語言

go語言的異常處理介紹

Go語言追求簡潔優雅,所以,Go語言不支援傳統的try…catch…finally 這種異常,因為Go語言的設計者們認為,將異常與控制結構混在一起會很容易使得程式碼變得混亂。

因為開發者很容易濫用異常,甚至一個小小的錯誤都拋出一個異常。在Go語言中,使用多值返回來傳回錯誤。不要用異常代替錯誤,更不要用來控制流程。在極個別的情況下,也就是說,遇到真正的異常的情況下(例如除數為0了)。才使用Go中引入的Exception處理:defer, panic, recover。

這幾個異常的使用場景可以這麼簡單描述:Go中可以拋出一個panic的異常,然後在defer中透過recover捕捉這個異常,然後正常處理。

範例程式碼:

package main
 
import "fmt"
 
func main(){
    defer func(){ // 必须要先声明defer,否则不能捕获到panic异常
        fmt.Println("c")
        if err:=recover();err!=nil{
            fmt.Println(err) // 这里的err其实就是panic传入的内容,55
        }
        fmt.Println("d")
    }()
    f()
}
 
func f(){
    fmt.Println("a")
    panic(55)
    fmt.Println("b")
    fmt.Println("f")
}

輸出結果:

##a

c
55
d
exit code 0, process exited normally.

defer

defer 英文原意: vi. 延遲;延期;服從  vt. 使延期;使延期。

defer的想法類似C 中的析構函數,不過Go語言中「析構」的不是對象,而是函數,defer就是用來加入函數結束時執行的語句。注意這裡強調的是添加,而不是指定,因為不同於C 中的析構函數是靜態的,Go中的defer是動態的。

func f() (result int) {
  defer func() {
    result++
  }()
  return 0
}

上面函數傳回1,因為defer中加入了一個函數,在函數傳回前改變了命名回傳值的值。是不是很好用。但是,要注意的是,如果我們的defer語句沒有執行,那麼defer的函數就不會加,如果把上面的程式改成這樣:

func f() (result int) {
  return 0
  defer func() {
    result++
  }()
  return 0
}

上面的函數就回傳0了,因為還沒來得及添加defer的東西,函數就回傳了。

另外值得一提的是,defer可以多次,這樣形成一個defer棧,後defer的語句在函數返回時將先被呼叫。

panic

panic 英文原意:n. 恐慌,驚慌;恐慌 adj. 恐慌的;沒有理由的 vt. 使恐慌 vi . 十分驚慌

panic 是用來表示非常嚴重的不可恢復的錯誤的。在Go語言中這是一個內建函數,接收一個interface{}類型的值(也就是任何值了)作為參數。 panic的作用就像我們平常接觸的異常。不過Go可沒有try…catch,所以,panic一般會導致程式掛掉(除非recover)。所以,Go語言中的異常,那真的是異常了。你可以試試,呼叫panic看看,程式立刻掛掉,然後Go運行時會印出呼叫棧。

但是,關鍵的一點是,即使函數執行的時候panic了,函數不往下走了,運行時並不是立刻向上傳遞panic,而是到defer那,等defer的東西都跑完了,panic再向上傳遞。所以這時候 defer 有點類似 try-catch-finally 中的 finally。
panic就是這麼簡單。拋出個真正意義上的異常。

recover

recover 英文原意: vt. 恢復;彌補;重新獲得   vi.恢復;勝訴;重新得球   n. 還原至預備姿勢

上面說到,panic的函數並不會立刻返回,而是先defer,再返回。這時候(defer的時候),如果有辦法將panic捕獲到,並阻止panic傳遞,那就異常的處理機制就完善了。

Go語言提供了recover內建函數,前面提到,一旦panic,邏輯就會走到defer那,那我們就在defer那等著,呼叫recover函數將會捕捉到目前的panic(如果有的話),被捕獲到的panic就不會向上傳遞了,於是,世界恢復了和平。你可以幹你想幹的事情了。

不過要注意的是,recover之後,邏輯並不會恢復到panic那個點去,函數還是會在defer之後回傳。

結論:

Go對待異常(準確的說是panic)的態度就是這樣,沒有全面否定異常的存在,同時極力不鼓勵多用異常。

以上是go語言的異常處理介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:博客园。如有侵權,請聯絡admin@php.cn刪除
使用GO編程語言構建可擴展系統使用GO編程語言構建可擴展系統Apr 25, 2025 am 12:19 AM

goisidealforbuildingscalablesystemsduetoitssimplicity,效率和建築物內currencysupport.1)go'scleansyntaxandaxandaxandaxandMinimalisticDesignenhanceProductivityAndRedCoductivityAndRedCuceErr.2)ItSgoroutinesAndInesAndInesAndInesAndineSandChannelsEnablenableNablenableNableNablenableFifficConcurrentscorncurrentprogragrammentworking torkermenticmminging

有效地使用Init功能的最佳實踐有效地使用Init功能的最佳實踐Apr 25, 2025 am 12:18 AM

Initfunctionsingorunautomationbeforemain()andareusefulforsettingupenvorments和InitializingVariables.usethemforsimpletasks,避免使用輔助效果,andbecautiouswithTestingTestingTestingAndLoggingTomaintAnainCodeCodeCodeClarityAndTestesto。

INIT函數在GO軟件包中的執行順序INIT函數在GO軟件包中的執行順序Apr 25, 2025 am 12:14 AM

goinitializespackagesintheordertheordertheyimported,thenexecutesInitFunctionswithinApcageIntheirdeFinityOrder,andfilenamesdetermineTheOrderAcractacractacrosmultiplefiles.thisprocessCanbeCanbeinepessCanbeInfleccessByendercrededBydeccredByDependenciesbetenciesbetencemendencenciesbetnependendpackages,whermayleLeadtocomplexinitialitialializizesizization

在GO中定義和使用自定義接口在GO中定義和使用自定義接口Apr 25, 2025 am 12:09 AM

CustomInterfacesingoarecrucialforwritingFlexible,可維護,andTestableCode.TheyEnableDevelostOverostOcusonBehaviorBeiroveration,增強ModularityAndRobustness.byDefiningMethodSigntulSignatulSigntulSignTypaterSignTyperesthattypesmustemmustemmustemmustemplement,InterfaceSallowForCodeRepodEreusaperia

在GO中使用接口進行模擬和測試在GO中使用接口進行模擬和測試Apr 25, 2025 am 12:07 AM

使用接口進行模擬和測試的原因是:接口允許定義合同而不指定實現方式,使得測試更加隔離和易於維護。 1)接口的隱式實現使創建模擬對像變得簡單,這些對像在測試中可以替代真實實現。 2)使用接口可以輕鬆地在單元測試中替換服務的真實實現,降低測試複雜性和時間。 3)接口提供的靈活性使得可以為不同測試用例更改模擬行為。 4)接口有助於從一開始就設計可測試的代碼,提高代碼的模塊化和可維護性。

在GO中使用init進行包裝初始化在GO中使用init進行包裝初始化Apr 24, 2025 pm 06:25 PM

在Go中,init函數用於包初始化。 1)init函數在包初始化時自動調用,適用於初始化全局變量、設置連接和加載配置文件。 2)可以有多個init函數,按文件順序執行。 3)使用時需考慮執行順序、測試難度和性能影響。 4)建議減少副作用、使用依賴注入和延遲初始化以優化init函數的使用。

GO的選擇語句:多路復用並發操作GO的選擇語句:多路復用並發操作Apr 24, 2025 pm 05:21 PM

go'SselectStatementTreamLinesConcurrentProgrambyMultiplexingOperations.1)itallowSwaitingOnMultipleChannEloperations,執行thefirstreadyone.2)theDefirstreadyone.2)thedefefcasepreventlocksbysbysbysbysbysbythoplocktrograpraproxrograpraprocrecrecectefnoopeready.3)

GO中的高級並發技術:上下文和候補組GO中的高級並發技術:上下文和候補組Apr 24, 2025 pm 05:09 PM

contextancandwaitgroupsarecrucialingoformanaginggoroutineseflect.1)context contextsallowsAllowsAllowsAllowsAllowsAllingCancellationAndDeadLinesAcrossapibiboundaries,確保GoroutinesCanbestoppedGrace.2)WaitGroupsSynChronizeGoroutines,確保Allimizegoroutines,確保AllizeNizeGoROutines,確保AllimizeGoroutines

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具