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

一文詳細(xì)談?wù)凣oLang的panic和error

 更新時間:2022年12月02日 10:35:58   作者:渣渣帥  
說是初識,并不是說第一次使用error和panic包,而是第一次特地去了解golang中的這兩個機(jī)制,下面這篇文章主要給大家介紹了關(guān)于如何通過一文詳細(xì)談?wù)凣oLang中panic和error的相關(guān)資料,需要的朋友可以參考下

前言

首先說一下: 錯誤指的是可能出現(xiàn)問題的地方出現(xiàn)了問題。如打開件失敗,這種情況在意料之中 。異常指的是不應(yīng)該出現(xiàn)問題的地方出現(xiàn)了問題。如引用了空指針,這種情況在意料之外

Go 提供兩種錯誤處理方式

  • 函數(shù)返回 error 類型對象判斷錯誤
  • panic 異常

1. panic

Go的類型系統(tǒng)會在編譯時捕獲很多錯誤,但有些錯誤只能在運行時檢查,如數(shù)組訪問越界、空指針引用等。這些運行時錯誤會引起painc異常。

一般而言,當(dāng)panic異常發(fā)生時,程序會中斷運行,并立即執(zhí)行在該goroutine(可以先理解成線程)中被延遲的函數(shù)(defer 機(jī)制)。隨后,程序崩潰并輸出日志信息。日志信息包括panic value和函數(shù)調(diào)用的堆棧跟蹤信息。panic value通常是某種錯誤信息。對于每個goroutine,日志信息中都會有與之相對的,發(fā)生panic時的函數(shù)調(diào)用堆棧跟蹤信息。通常,我們不需要再次運行程序去定位問題,日志信息已經(jīng)提供了足夠的診斷依據(jù)。因此,在我們填寫問題報告時,一般會將panic異常和日志信息一并記錄。不是所有的panic異常都來自運行時,直接調(diào)用內(nèi)置的panic函數(shù)也會引發(fā)panic異常;panic函數(shù)接受任何值作為參數(shù)。當(dāng)某些不應(yīng)該發(fā)生的場景發(fā)生時,我們就應(yīng)該調(diào)用panic。雖然Go的panic機(jī)制類似于其他語言的異常,但panic的適用場景有一些不同。由于panic會引起程序的崩潰,因此panic一般用于嚴(yán)重錯誤,如程序內(nèi)部的邏輯不一致。

panic可以手工調(diào)用,但是 Go 官方建議盡量不要使用panic,每一個異常都應(yīng)該用 error 對象捕獲。如果異常出現(xiàn)了,但沒有被捕獲并恢復(fù),Go 程序的執(zhí)行就會被終止,即便出現(xiàn)異常的位置不在主 Goroutine 中也會這樣。

總結(jié)來說:

panic是一個嚴(yán)重錯誤機(jī)制,它會導(dǎo)致程序終止,并依次逆序執(zhí)行 panic 所在函數(shù)可能存在的 defer 函數(shù)列表,然后返回該函數(shù)的調(diào)用方。recover 內(nèi)置函數(shù)可用于捕獲 panic,重新恢復(fù)程序正常執(zhí)行流程,但是 recover 函數(shù)只有在 defer 內(nèi)部使用才有效

此外,當(dāng) panic() 觸發(fā)的宕機(jī)發(fā)生時, panic() 后面的代碼將不會被運行,但是在 panic() 函數(shù)前面已經(jīng)運行過的 defer 語句依然會在宕機(jī)發(fā)生時發(fā)生作用

2. recover

1. recover 是一個 Go 語言的內(nèi)建函數(shù),可以讓進(jìn)入宕機(jī)流程中的 goroutine 恢復(fù)過來。

2. 用來控制一個goroutine的panicking行為,捕獲panic,從而影響應(yīng)用的行為

3. 一般的調(diào)用建議

a). 在defer函數(shù)中,通過recever來終止一個gojroutine的panicking過程,從而恢復(fù)正常代碼的執(zhí)行

b). 可以獲取通過panic傳遞的error

簡單來講:go中可以拋出一個panic的異常,然后在defer中通過recover捕獲這個異常,然后正常處理。

4. 在正常的執(zhí)行過程中,調(diào)用 recover 會返回 nil 并且沒有其他任何效果;

注意:利用recover處理panic指令,defer必須在panic之前聲明,否則當(dāng)panic時,recover無法捕獲到panic.

總結(jié)來說 Go 語言沒有異常系統(tǒng),其使用 panic 觸發(fā)宕機(jī)類似于其他語言的拋出異常, recover 的宕機(jī)恢復(fù)機(jī)制就對應(yīng)其它語言中的 try/catch 機(jī)制。

panic 和 recover 的關(guān)系

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

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

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

注意:在 panic 觸發(fā)的 defer 函數(shù)內(nèi),可以繼續(xù)調(diào)用 panic ,進(jìn)一步將錯誤外拋,直到程序整體崩潰。如果想在捕獲錯誤時設(shè)置當(dāng)前函數(shù)的返回值,可以對返回值使用命名返回值方式直接進(jìn)行設(shè)置。

示例:

package main
 
func test() {
	defer func() {
		if err := recover(); err != nil { // recover 捕獲錯誤。
			println(err.(string)) // 將 interface{} 轉(zhuǎn)型為具體類型。
		}
	}()
	panic("panic error!")	// panic 拋出錯誤
}
func main() {
	test()
}

3. error

go中的錯誤處理,是通過返回值的形式來出來,要么你忽略,要么你處理(處理也可以是繼續(xù)返回給調(diào)用者),對于golang這種設(shè)計方式,我們會在代碼中寫大量的if判斷,以便做出決定。

對于err如果是nil就代表沒有錯誤,如果不是nil就代表程序出問題了,需要對錯誤進(jìn)行處理了。

示例:

func main() {
	conent,err:=ioutil.ReadFile("filepath")
	if err !=nil{
		//錯誤處理
	}else {
		fmt.Println(string(conent))
	}
}

此外,error類型是go語言的一種內(nèi)置類型,使用的時候不用特定去import,他本質(zhì)上是一個接口,

 type error interface{
  Error() string //Error()是每一個訂制的error對象需要填充的錯誤消息,可以理解成是一個字段Error
}

總結(jié)

到此這篇關(guān)于GoLang中panic和error的文章就介紹到這了,更多相關(guān)GoLang的panic和error內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺析Go語言容器之?dāng)?shù)組和切片的使用

    淺析Go語言容器之?dāng)?shù)組和切片的使用

    在?Java?的核心庫中,集合框架可謂鼎鼎大名:Array?、List、Set等等,隨便拎一個出來都值得開發(fā)者好好學(xué)習(xí)如何使用甚至是背后的設(shè)計源碼。雖然Go語言沒有如此豐富的容器類型,但也有一些基本的容器供開發(fā)者使用,接下來讓我們認(rèn)識一下這些容器類型吧
    2022-11-11
  • go語言接口的定義和實現(xiàn)簡單分享

    go語言接口的定義和實現(xiàn)簡單分享

    這篇文章主要介紹了go語言接口的定義和實現(xiàn)簡單分享的相關(guān)資料,需要的朋友可以參考下
    2023-08-08
  • Golang實現(xiàn)IO操作

    Golang實現(xiàn)IO操作

    本文主要介紹了Golang實現(xiàn)IO操作,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • Go單元測試?yán)鱰estify使用示例詳解

    Go單元測試?yán)鱰estify使用示例詳解

    這篇文章主要為大家介紹了Go單元測試?yán)鱰estify使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Go?Excelize?API源碼閱讀Close及NewSheet方法示例解析

    Go?Excelize?API源碼閱讀Close及NewSheet方法示例解析

    這篇文章主要為大家介紹了Go?Excelize?API源碼閱讀Close及NewSheet方法示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 對Golang中的runtime.Caller使用說明

    對Golang中的runtime.Caller使用說明

    這篇文章主要介紹了對Golang中的runtime.Caller使用說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • go語言中切片的長度和容量的區(qū)別

    go語言中切片的長度和容量的區(qū)別

    這篇文章主要介紹了go語言中切片的長度和容量的區(qū)別,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • GoFrame框架gset交差并補(bǔ)集使用實例

    GoFrame框架gset交差并補(bǔ)集使用實例

    這篇文章主要為大家介紹了GoFrame框架gset交差并補(bǔ)集使用實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • golang?debug調(diào)試的實現(xiàn)

    golang?debug調(diào)試的實現(xiàn)

    本文主要介紹了使用Go語言進(jìn)行本地調(diào)試和遠(yuǎn)程調(diào)試,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12
  • Golang通脈之map詳情

    Golang通脈之map詳情

    這篇文章主要介紹了Golang通脈之map,Go語言中提供的映射關(guān)系容器為map,其內(nèi)部使用散列表(hash)實現(xiàn),map 是一種無序的鍵值對的集合。map 最重要的一點是通過 key 來快速檢索數(shù)據(jù),key 類似于索引,指向數(shù)據(jù)的值 map 是一種集合,所以可以像迭代數(shù)組和切片那樣迭代它
    2021-10-10

最新評論

朝阳市| 安达市| 北碚区| 十堰市| 达尔| 大城县| 通州市| 伊金霍洛旗| 馆陶县| 新余市| 岑溪市| 嘉祥县| 海阳市| 松阳县| 乐东| 苍梧县| 渭南市| 民县| 宁波市| 出国| 房产| 普宁市| 菏泽市| 阿克苏市| 萨迦县| 双鸭山市| 客服| 宾川县| 建湖县| 辛集市| 昌乐县| 昌江| 烟台市| 金阳县| 昌吉市| 大连市| 武汉市| 娄底市| 耿马| 江山市| 沂水县|