<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
首先說一下: 錯誤指的是可能出現問題的地方出現了問題。如開啟件失敗,這種情況在意料之中 。異常指的是不應該出現問題的地方出現了問題。如參照了空指標,這種情況在意料之外
Go
提供兩種錯誤處理方式
error
型別物件判斷錯誤panic
異常Go的型別系統會在編譯時捕獲很多錯誤,但有些錯誤只能在執行時檢查,如陣列存取越界、空指標參照等。這些執行時錯誤會引起painc異常。
一般而言,當panic異常發生時,程式會中斷執行,並立即執行在該goroutine(可以先理解成執行緒)中被延遲的函數(defer 機制)。隨後,程式崩潰並輸出紀錄檔資訊。紀錄檔資訊包括panic value和函數呼叫的堆疊跟蹤資訊。panic value通常是某種錯誤資訊。對於每個goroutine,紀錄檔資訊中都會有與之相對的,發生panic時的函數呼叫堆疊跟蹤資訊。通常,我們不需要再次執行程式去定位問題,紀錄檔資訊已經提供了足夠的診斷依據。因此,在我們填寫問題報告時,一般會將panic異常和紀錄檔資訊一併記錄。不是所有的panic異常都來自執行時,直接呼叫內建的panic函數也會引發panic異常;panic函數接受任何值作為引數。當某些不應該發生的場景發生時,我們就應該呼叫panic。雖然Go的panic機制類似於其他語言的異常,但panic的適用場景有一些不同。由於panic會引起程式的崩潰,因此panic一般用於嚴重錯誤,如程式內部的邏輯不一致。
panic
可以手工呼叫,但是 Go
官方建議儘量不要使用panic
,每一個異常都應該用 error
物件捕獲。如果異常出現了,但沒有被捕獲並恢復,Go
程式的執行就會被終止,即便出現異常的位置不在主 Goroutine
中也會這樣。
總結來說:
panic是一個嚴重錯誤機制,它會導致程式終止,並依次逆序執行 panic 所在函數可能存在的 defer 函數列表,然後返回該函數的呼叫方。recover 內建函數可用於捕獲 panic,重新恢復程式正常執行流程,但是 recover 函數只有在 defer 內部使用才有效
此外,當 panic()
觸發的宕機發生時, panic()
後面的程式碼將不會被執行,但是在 panic()
函數前面已經執行過的 defer
語句依然會在宕機發生時發生作用
1. recover
是一個 Go
語言的內建函數,可以讓進入宕機流程中的 goroutine
恢復過來。
2. 用來控制一個goroutine的panicking行為,捕獲panic,從而影響應用的行為
3. 一般的呼叫建議
a). 在defer函數中,通過recever來終止一個gojroutine的panicking過程,從而恢復正常程式碼的執行
b). 可以獲取通過panic傳遞的error
簡單來講:go中可以丟擲一個panic的異常,然後在defer中通過recover捕獲這個異常,然後正常處理。
4. 在正常的執行過程中,呼叫 recover
會返回 nil
並且沒有其他任何效果;
注意:利用recover處理panic指令,defer必須在panic之前宣告,否則當panic時,recover無法捕獲到panic.
總結來說 Go
語言沒有異常系統,其使用 panic
觸發宕機類似於其他語言的丟擲異常, recover
的宕機恢復機制就對應其它語言中的 try/catch
機制。
panic 和 recover 的關係
panic 和 recover 的組合有如下特性:
有 panic 沒 recover ,程式宕機。
有 panic 也有 recover ,程式不會宕機,執行完對應的 defer 後,從宕機點退出當前函數後繼續執行。
注意:在 panic 觸發的 defer 函數內,可以繼續呼叫 panic ,進一步將錯誤外拋,直到程式整體崩潰。如果想在捕獲錯誤時設定當前函數的返回值,可以對返回值使用命名返回值方式直接進行設定。
範例:
package main func test() { defer func() { if err := recover(); err != nil { // recover 捕獲錯誤。 println(err.(string)) // 將 interface{} 轉型為具體型別。 } }() panic("panic error!") // panic 丟擲錯誤 } func main() { test() }
go中的錯誤處理,是通過返回值的形式來出來,要麼你忽略,要麼你處理(處理也可以是繼續返回給呼叫者),對於golang這種設計方式,我們會在程式碼中寫大量的if判斷,以便做出決定。
對於err如果是nil就代表沒有錯誤,如果不是nil就代表程式出問題了,需要對錯誤進行處理了。
範例:
func main() { conent,err:=ioutil.ReadFile("filepath") if err !=nil{ //錯誤處理 }else { fmt.Println(string(conent)) } }
此外,error型別是go語言的一種內建型別,使用的時候不用特定去import,他本質上是一個介面,
type error interface{ Error() string //Error()是每一個訂製的error物件需要填充的錯誤訊息,可以理解成是一個欄位Error }
到此這篇關於GoLang中panic和error的文章就介紹到這了,更多相關GoLang的panic和error內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45