Go從入門到精通——函式-處理執行時發生的錯誤
阿新 • • 發佈:2022-05-28
處理執行時發生的錯誤
Go 語言的錯誤處理思想及設計包含以下特徵:
- 一個可能造成錯誤的函式,需要返回值中翻譯個錯誤介面(error)。如果呼叫是成功的,錯誤介面返回nil,否則返回錯誤。
- 在函式呼叫後需要檢查錯誤,如果發生錯誤,進行必要的錯誤處理。
一、net包中的例子
net.Dial()是 Go語言系統包 net 中的一個函式,一般用於建立 Socket 連線。
ent.Dial() 擁有兩個返回值,即 Conn 和 error。這個函式是阻塞的,因此在 Socket 操作後,會返回 Conn 連線物件和 error:如果發生錯誤,error 會告知錯誤的型別,Conn 會返回空。
根據 Go 語言的錯誤處理機制,Conn 是其重要的返回值。因此,為這個函式增加一個錯誤返回,類似 error。參見下面的程式碼
https://pkg.go.dev/net#Dial
func Dial(network, address string) (Conn, error){
var d Dialer
return d.Dial(network, address)
}
二、錯誤介面的定義格式
error 是 Go 系統宣告的介面型別,程式碼如下:
type error interface{
Error() string
}
所有符合 Error()string 格式的方法,都能實現錯誤介面。
Error()方法返回錯誤的具體描述,使用者可以通過這個字串知道發生了什麼錯誤。
三、定義一個錯誤
返回錯誤前,需要定義會產生哪些可能的錯誤。在 Go 語言中,使用 errors 包進行錯誤的定義,格式如下:
var err = errors.New("this is an error")
錯誤字串由於相對固定,一般在包作用域宣告,應儘量減少在使用時直接使用 errors.New 返回。
1. errors包
Go語言的 errors 中對 New 的定義非常簡單,程式碼如下:
//建立錯誤物件 func New(text string) error{ //將 errorString 結構體例項化,並賦值錯誤描述的成員。 return &errorString{text} } //錯誤字串 type errorString struct{ //宣告 errorString 結構體,擁有一個成員,描述錯誤內容。 s string } //返回發生何種錯誤 func (e *errorString) Error() strings{ // 實現 error 介面的 Error() 方法,該方法返回成員中的錯誤描述。 return e.s }
2. 在程式碼中使用錯誤定義
下面的程式碼會定義一個除法函式,當除數為 0 時,返回一個預定義的除數為 0 的錯誤。
package main
import (
"errors"
"fmt"
)
//定義除數為 0 的錯誤
var errDivsionByZero = errors.New("錯誤: 除數不能為0")
func div(dividend, divisor int) (int, error) {
//判斷除數為 0 的情況,並返回
if divisor == 0 {
return 0, errDivsionByZero
}
//正常計算,返回空錯誤
return dividend / divisor, nil
}
func main() {
fmt.Println(div(1, 0))
fmt.Println(div(10, 2))
}