錯誤是什麼?
錯誤指的是可能出現問題的地方出現了問題。比如開啟乙個檔案時失敗,這種情況在人們的意料之中。
而異常指的是不應該出現問題的地方出現了問題。比如引用了空指標,這種情況在人們的意料之外。可見,錯誤是業務過程的一部分,而異常不是。
go中的錯誤也是一種型別。錯誤用內建的error型別表示。就像其他型別的,如int, float64, 。錯誤值可以儲存在變數中,從函式中返回,等等。
讓我們從乙個示例程式開始,這個程式嘗試開啟乙個不存在的檔案。
在os包中有開啟檔案的功能函式:
func open(name string) (file *file, err error)
如果檔案已經成功開啟,那麼open函式將返回檔案處理。如果在開啟檔案時出現錯誤,將返回乙個非nil錯誤。
func
main()
fmt.
println
(f.name()
,"opened success"
)}
如果乙個函式或方法返回乙個錯誤,那麼按照慣例,它必須是函式返回的最後乙個值。因此,open 函式返回的值是最後乙個值。
處理錯誤的慣用方法是將返回的錯誤與nil進行此較。nil值表示沒有發生錯誤,而非nil值表示出現錯誤。在我們的例子中,我們檢查錯誤是否為nil。如果它不是nil,我們只需列印錯誤並從主函式返回。
go語言通過內建的錯誤介面提供了非常簡單的錯誤處理機制。
讓我們再深入一點,看看如何定義錯誤型別的構建。錯誤是乙個帶有以下定義的介面型別,
type
error
inte***ce
它包含乙個帶有error ()字串的方法。任何實現這個介面的型別都可以作為乙個錯誤使用。這個方法提供了對錯誤的描述。
當列印錯誤時,fmt.printin函式在內部呼叫error() 方法來獲取錯誤的描述。這就是錯誤描述是如何在一行中列印出來的。
從錯誤中提取更多資訊的不同方法
既然我們知道錯誤是一種介面型別,那麼讓我們看看如何提取更多關於錯誤的資訊。
在上面的例子中,我們僅僅是列印了錯誤的描述。如果我們想要的是導致錯誤的檔案的實際路徑。一種可能的方法是解析錯誤字串。
// errors 建立error物件
err = errors.
new(
"錯誤資訊!!!!"
) fmt.
println
(err)
// 錯誤資訊!!!!
fmt.
printf
("%t\n"
, err)
// *errors.errorstring
// fmt 建立error物件
err2 := fmt.
errorf
("錯誤資訊: %d"
,100
) fmt.
println
(err2)
// 錯誤資訊: 100
fmt.
printf
("%t\n"
, err2)
// *errors.errorstring
func
checkage
(age int
)error
return
nil}
package main
import
("fmt"
)/**
* @author: zsy
* @date: 2020/7/26 21:21
* @desc:
*/// 定義乙個結構體,表示錯誤的型別
type areaerror struct
// 實現error介面,就是實現error()方法
func
(e *areaerror)
error()
string
func
(e *areaerror)
lengthnegative()
bool
func
(e *areaerror)
widthnegative()
bool
func
rectarea
(length, width float64)(
float64
,error
)if width <
0else
}if msg !=""}
return length * width,
nil}
func
main()
if err.
widthnegative()
fmt.
println
(err.length)
// -4
fmt.
println
(err.width)
// -3
fmt.
println
(err.msg)
// 長度小於0,寬度小於0
}return
} fmt.
println
("面積:"
, area)
}
defer 相當於把當前行放到乙個棧裡面,最後執行,每個方法屬於乙個區域
函式a()
函式b()12
3456
789defer 函式b()2。。。
defer 函式b()1。。。。
main…over…
defer main 4。。。。
defer main 3。。。。
func
myprint
(s string
)func
funa()
func
funb()
defer
myprint
("defer 函式b()2。。。")}
func
main()
panic 其後的所有都不能執行了中斷了,只有已經被執行defer的函式執行完後,這個恐慌(panic)才會傳到函式呼叫處
函式a()
函式b()12
345defer 函式b()1。。。。
defer main 3。。。。
panic: 函式b() panic
goroutine 1 [running]:
main.funb()
d:/go/goworks/src/basic/panicdemo.go:24 +0x1f2
main.main()
d:/go/goworks/src/basic/panicdemo.go:33 +0xda
package main
import
"fmt"
/** * @author: zsy
* @date: 2020/7/26 21:39
* @desc:
*/func
myprint
(s string
)func
funa()
func
funb()
}defer
myprint
("defer 函式b()2。。。")}
func
main()
可以捕獲panic,還可以獲取panic中的資訊
panic — try
recover – catch
函式a()
函式b()12
345defer 函式b()1。。。。
函式b() panic 程式恢復
main…over…
defer main 4。。。。
defer main 3。。。。
package main
import
"fmt"
/** * @author: zsy
* @date: 2020/7/26 21:39
* @desc:
*/func
myprint
(s string
)func
funa()
func
funb()
}() fmt.
println
("函式b()"
)defer
myprint
("defer 函式b()1。。。。"
)for i :=
1; i <
10; i++
}defer
myprint
("defer 函式b()2。。。")}
func
main()
golang 錯誤處理
go 程式使用 error 值來表示錯誤狀態。與 fmt.stringer 類似,error 型別是乙個內建介面 type error inte ce 與 fmt.stringer 類似,fmt 包在列印值時也會滿足 error。通常函式會返回乙個 error 值,呼叫的它的 應當判斷這個錯誤是否等...
golang 錯誤處理
一 defer package main import fmt os bufio func trydefer func writefile filename string else return defer file.close 無論return panic最後都會被執行 writer bufio....
Golang的錯誤處理
1 當錯誤 panic 發生後,程式就會退出 崩潰 2 希望發生錯誤後,能夠捕獲到錯誤,並對其進行處理,保證後續程式能夠繼續執行 go中引入的處理方式是 defer panic recover。其中go中可以丟擲乙個panic異常,然後在defer中通過recover捕獲這個異常,然後正常處理。1 ...