Pergi pengendalian ralat


Bahasa Go menyediakan mekanisme pengendalian ralat yang sangat mudah melalui antara muka ralat terbina dalam.

Jenis ralat ialah jenis antara muka, ini adalah definisinya:

type error interface {
    Error() string
}

Kami boleh menjana mesej ralat dengan melaksanakan jenis antara muka ralat dalam pengekodan.

Fungsi biasanya mengembalikan maklumat ralat dalam nilai pulangan akhir. Gunakan ralat.Baru untuk mengembalikan mesej ralat:

func Sqrt(f float64) (float64, error) {
    if f < 0 {
        return 0, errors.New("math: square root of negative number")
    }
    // 实现
}

Dalam contoh berikut, kami menghantar nombor negatif apabila memanggil Sqrt, dan kemudian mendapatkan objek ralat bukan nol, dan membandingkan objek ini dengan Perbandingan nil, keputusan adalah benar, jadi fmt.Println (pakej fmt akan memanggil kaedah Ralat semasa memproses ralat) dipanggil untuk mengeluarkan ralat, sila lihat kod contoh yang dipanggil di bawah:

result, err:= Sqrt(-1)

if err != nil {
   fmt.Println(err)
}

Instance

package main

import (
	"fmt"
)

// 定义一个 DivideError 结构
type DivideError struct {
	dividee int
	divider int
}

// 实现 	`error` 接口
func (de *DivideError) Error() string {
	strFormat := `
	Cannot proceed, the divider is zero.
	dividee: %d
	divider: 0
`
	return fmt.Sprintf(strFormat, de.dividee)
}

// 定义 `int` 类型除法运算的函数
func Divide(varDividee int, varDivider int) (result int, errorMsg string) {
	if varDivider == 0 {
		dData := DivideError{
			dividee: varDividee,
			divider: varDivider,
		}
		errorMsg = dData.Error()
		return
	} else {
		return varDividee / varDivider, ""
	}

}

func main() {

	// 正常情况
	if result, errorMsg := Divide(100, 10); errorMsg == "" {
		fmt.Println("100/10 = ", result)
	}
	// 当被除数为零的时候会返回错误信息
	if _, errorMsg := Divide(100, 0); errorMsg != "" {
		fmt.Println("errorMsg is: ", errorMsg)
	}

}

Jalankan program di atas, hasil output ialah:

100/10 =  10
errorMsg is:  
	Cannot proceed, the divider is zero.
	dividee: 100
	divider: 0