Go語言學習筆記16.異常處理

error接口

type error interface {
    Error() string
}
package errors

type errorString struct { 
    text string 
}

func New(text string) error { 
    return &errorString{text} 
}

func (e *errorString) Error() string { 
    return e.text 
}

使用:

package main

import "fmt"
import "errors"

//函數通常在最後的返回值中返回錯誤信息:
func MyDiv(a, b int) (result int, err error) {
	err = nil
	if b == 0 {
		err = errors.New("分母不能爲0")
	} else {
		result = a / b
	}

	return
}

func main() {
	//利用fmt打印錯誤	
	err1 := fmt.Errorf("%s", "this is normal err1")
	fmt.Println("err1 = ", err1)

	err2 := errors.New("this is normal err2")
	fmt.Println("err2 = ", err2)

	test := err2.Error()
	fmt.Println("test = ", test)

	//調用函數的時候同時接收錯誤信息
	result, err := MyDiv(10, 0)
	if err != nil {
		fmt.Println("err = ", err)
	} else {
		fmt.Println("reslut = ", result)
	}

}

panic和recover

panic屬於異常,比如數組訪問越界、空指針引用,如果顯示調用panic也能觸發,通常用來記錄會導致系統崩潰的問題。
recover則是用來接收這種異常。但是recover只有在defer調用的函數中有效。
如果調用了內置函數recover,並且定義該defer語句的函數發生了panic異常,recover會使程序從panic中恢復,並返回panic value。導致panic異常的函數不會繼續運行,但能正常返回。在未發生panic時調用recover,recover會返回nil。

package main

import "fmt"

func testa() {
	fmt.Println("aaaaaaaaaaaaaaaaa")
}

func testb(x int) {
	
	//設置recover
	defer func() {
		//用err變量接收錯誤信息,返回給調用者
		if err := recover(); err != nil { //產生了panic異常
			fmt.Println(err) //runtime error: index out of range
		}

	}() //別忘了(), 調用此匿名函數

	var a [10]int
	a[x] = 111 //當x爲20時候,導致數組越界,產生一個panic,導致程序崩潰
}

func testc() {
	//顯式調用panic函數,導致程序中斷
	panic("this is a panic test")
}

func main() {
	testa()
	testb(20)
	testc()
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章