GO基礎之異常處理

1、異常

一、 錯誤指程序中出現不正常的狀況,從而致使程序沒法正常執行。
•大多語言中使用try... catch... finally語句執行。
假設咱們正在嘗試打開一個文件,文件系統中不存在這個文件。這是一個異常狀況,它表示爲一個錯誤。
二、 Go語言中沒有try...catchgit

  • • Go語言經過內置的錯誤類型提供了很是簡單的錯誤處理機制。
  • •錯誤值能夠存儲在變量中,經過函數中返回。
  • 若是一個函數或方法返回一個錯誤,按照慣例,它必須是函數返回的最後一個值。
  • •處理錯誤的慣用方式是將返回的錯誤與nil進行比較。
  • nil值表示沒有發生錯誤,而非nil值表示出現錯誤。
  • •若是不是nil,需打印輸出錯誤。

go中error的源碼github

package errors

// New returns an error that formats as the given text.
// Each call to New returns a distinct error value even if the text is identical.
func New(text string) error {
    return &errorString{text}
}

// errorString is a trivial implementation of error.
type errorString struct {
    s string
}

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

 

2、go中的異常處理

 

 

 

package main

import (
    "math"
    "fmt"
    "os"
    "github.com/pkg/errors"
)

func main() {
    //    異常狀況1
    res := math.Sqrt(-100)
    fmt.Println(res)

    res , err := Sqrt(-100)
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Println(res)
    }


    //異常狀況2
    //res = 100 / 0
    //fmt.Println(res)
    res , err = Divide(100 , 0)
    if err != nil {
        fmt.Println(err.Error())
    } else {
        fmt.Println(res)
    }

    //異常狀況3
    f, err := os.Open("/abc.txt")
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Println(f.Name() , "該文件成功被打開!")
    }

}

//定義平方根運算函數
func Sqrt(f float64)(float64 , error) {
    if f<0 {
        return 0 , errors.New("負數不能夠獲取平方根")
    } else {
        return math.Sqrt(f) , nil
    }
}

//定義除法運算函數
func Divide(dividee float64 , divider float64)(float64 , error) {
    if divider == 0 {
        return 0 , errors.New("出錯:除數不能夠爲0!")
    } else {
        return dividee / divider , nil
    }
}
View Code

go中error的建立方式ide

//error建立方式一
func Sqrt(f float64)(float64 , error) {
    if f<0 {
        return 0 , errors.New("負數不能夠獲取平方根")
    } else {
        return math.Sqrt(f) , nil
    }
}
//error建立方式二;設計一個函數:驗證年齡。若是是負數,則返回error
func checkAge(age int) (string, error) {
    if age < 0 {
        err := fmt.Errorf("您的年齡輸入是:%d , 該數值爲負數,有錯誤!", age)
        return "", err
    } else {
        return fmt.Sprintf("您的年齡輸入是:%d ", age), nil
    }
}

4、自定義錯誤

• 一、定義一個結構體,表示自定義錯誤的類型
• 二、讓自定義錯誤類型實現error接口的方法:Error() string
• 三、定義一個返回error的函數。根據程序實際功能而定。函數

package main

import (
    "time"
    "fmt"
)

//一、定義結構體,表示自定義錯誤的類型
type MyError struct {
    When time.Time
    What string
}

//二、實現Error()方法
func (e MyError) Error() string {
    return fmt.Sprintf("%v : %v", e.When, e.What)
}

//三、定義函數,返回error對象。該函數求矩形面積
func getArea(width, length float64) (float64, error) {
    errorInfo := ""
    if width < 0 && length < 0 {
        errorInfo = fmt.Sprintf("長度:%v, 寬度:%v , 均爲負數", length, width)
    } else if length < 0 {
        errorInfo = fmt.Sprintf("長度:%v, 出現負數 ", length)
    } else if width < 0 {
        errorInfo = fmt.Sprintf("寬度:%v , 出現負數", width)
    }
    if errorInfo != "" {
        return 0, MyError{time.Now(), errorInfo}
    } else {
        return width * length, nil
    }
}

func main() {
    res , err := getArea(-4, -5)
    if err != nil {
        fmt.Printf(err.Error())
    } else {
        fmt.Println("面積爲:" , res)
    }
}
View Code
相關文章
相關標籤/搜索