1. 程式人生 > 其它 >Go從入門到精通——函式-處理執行時發生的錯誤

Go從入門到精通——函式-處理執行時發生的錯誤

處理執行時發生的錯誤

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))
}