Go語言學(xué)習(xí)筆記之錯誤和異常詳解_第1頁
Go語言學(xué)習(xí)筆記之錯誤和異常詳解_第2頁
Go語言學(xué)習(xí)筆記之錯誤和異常詳解_第3頁
Go語言學(xué)習(xí)筆記之錯誤和異常詳解_第4頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第Go語言學(xué)習(xí)筆記之錯誤和異常詳解目錄錯誤異??偨Y(jié)

錯誤

Go語言通過內(nèi)置的錯誤接口提供了非常簡單的錯誤處理機(jī)制,Error類型是一個接口類型。

typeerrorinterface{

Error()string

}

可以在編碼中通過實(shí)現(xiàn)error接口類型來生成錯誤信息。

函數(shù)通常在最后的返回值中返回錯誤信息。

//定義一個DivideError結(jié)構(gòu)

typeDivideErrorstruct{

divideeint

dividerint

//實(shí)現(xiàn)`error`接口

func(de*DivideError)Error()string{

strFormat:=`

Cannotproceed,thedivideriszero.

dividee:%d

divider:0

returnfmt.Sprintf(strFormat,de.dividee)

funcDivide(varDivideeint,varDividerint)(resultint,errorMsgstring){

ifvarDivider==0{

dData:=DivideError{

dividee:varDividee,

divider:varDivider,

errorMsg=dData.Error()

return

}else{

returnvarDividee/varDivider,""

}

Divide函數(shù)傳入除數(shù)和被除數(shù),當(dāng)被除數(shù)為零時,函數(shù)拋出異常。

ifresult,errorMsg:=Divide(100,10);errorMsg==""{

fmt.Println(result)

}

這是正常情況下。

當(dāng)除數(shù)為零的時候會返回錯誤信息。

if_,errorMsg:=Divide(100,0);errorMsg!=""{

fmt.Println("errorMsgis:",errorMsg)

}

異常

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

當(dāng)程序發(fā)生異常時,無法繼續(xù)運(yùn)行,使用panic來終止程序。

應(yīng)該盡可能地使用錯誤,而不是使用panic和recover。只有當(dāng)程序不能繼續(xù)運(yùn)行的時候,才應(yīng)該使用panic和recover機(jī)制。

panic有兩個合理的用例:

發(fā)生了一個不能恢復(fù)的錯誤,此時程序不能繼續(xù)運(yùn)行。發(fā)生了一個編程上的錯誤。一個接收指針參數(shù)的方法,而其他人使用nil作為參數(shù)調(diào)用了它。在這種情況下,可以使用panic,因?yàn)檫@是一個編程錯誤:用nil參數(shù)調(diào)用了一個只能接收合法指針的方法。

內(nèi)建函數(shù)panic:

funcpanic(vinterface{})

當(dāng)程序終止時,會打印傳入panic的參數(shù)。

packagemain

funcmain(){

panic("panicerror")

}

會打印出傳入panic函數(shù)的信息,并打印出堆棧跟蹤。

recover是一個內(nèi)建函數(shù),用于重新獲得panic協(xié)程的控制。

funcrecover()interface{}

recover必須在defer函數(shù)中才能生效,在延遲函數(shù)內(nèi)調(diào)用recover,可以取到panic的錯誤信息,并且停止panic續(xù)發(fā)事件。只有在相同的協(xié)程中調(diào)用recover才管用,recover不能恢復(fù)一個不同協(xié)程的panic。

packagemain

import"fmt"

funcoutOfArray(xint){

deferfunc(){

//recover()可以將捕獲到的panic信息打印

iferr:=recover();err!=nil{

fmt.Println(err)

vararray[5]int

array[x]=1

funcmain(){

//故意制造數(shù)組越界觸發(fā)panic

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論