對出初學者往往忽視程序中異常處理曼库,認為程序總是是在一個被百般呵護的環(huán)境運行,沒有任何風吹雨打臀防,這是因為我們是最了解自己程序的人眠菇。所以我們知道他喜歡什么,什么能吃什么不能吃袱衷。不過終歸有一天他回歸自然捎废。這是適應外界環(huán)境是他能否在激烈競爭市場存活的基本條件。這種適應外界惡劣環(huán)境能力就是他對異乘钫眩或錯誤處理的能力缕坎。
在 go 語言中引入標準錯誤處理模型,錯誤接口篡悟。只要實現(xiàn)了 error 接口的數(shù)據(jù)類型我們就可以認為其為錯誤類型谜叹。
type error interface {
Error() string
}
通過代碼證明一下上面的結(jié)論匾寝,定義 errorString 結(jié)構(gòu)體,然后讓其實現(xiàn) Error 方法荷腊,只要實現(xiàn) interface 的方法我們認為這個結(jié)構(gòu)體就實現(xiàn)了 error 接口艳悔。這個就是 go 語言接口設計巧妙之處。
type errorString struct{
s string
}
type (e *errorString) Error() string{
return e.string
}
在之前接觸到一些有關 IO 或者網(wǎng)絡操作函數(shù)都會在多重返回值中返回一個錯誤女仰,錯誤類型通常位于最后一個返回值猜年。雖然這只是一種習慣,也希望大家在設計函數(shù)式按照習慣來疾忍。好的規(guī)范才有優(yōu)雅的代碼乔外。
type Tut struct {
Title string
Courses int
}
var db map[string]Tut
func addTut(t Tut) error{
if t.Courses == 0 {
return // 如果只有 title 沒有課程數(shù)我們就拋出一個錯誤
}
//如果添加課程已經(jīng)存在于 db 中,我們就拋出條目重復
// 對數(shù)據(jù)進行保存
db[t.Title] = t
return nil
}
我們在添加課程 addTut 方法返回一個錯誤一罩,發(fā)生錯誤情況如下
- 添加課程的課程數(shù)為零情況
- 數(shù)據(jù)庫中已經(jīng)存在該課程記錄
下面為具體實例杨幼,大家可以自己試一試
ype Tut struct {
Title string
Courses int
}
var db map[string]Tut
func addTut(t Tut) error{
if t.Courses == 0 {
return errors.New("課程不能為 0 ")
}
_, ok := db[t.Title]
if !ok {
return errors.New("重復記錄")
}
db[t.Title] = t
return nil
}
func main() {
db = make(map[string]Tut)
angularTut := Tut{ Title:"angular", Courses: 0}
err := addTut(angularTut)
if err != nil{
fmt.Println("錯誤處理: " + err.Error())
}
//處理錯誤
angularTwoTut := Tut{ Title:"angular", Courses: 0}
err3 := addTut(angularTwoTut)
if err3 != nil{
}
angularDuplicated := Tut{Title:"angular",Courses:10}
err2 := addTut(angularDuplicated)
if err2 != nil{
fmt.Println("錯誤處理" + err2.Error())
}
}
錯誤處理: 課程不能為 0
錯誤處理重復記錄
在 addTut 內(nèi)部對我們之前認為錯誤兩種情況進行判斷,如果認為是錯誤我們就拋出 Error 聂渊,通過定義不同輸出內(nèi)容編譯使用者了解錯誤發(fā)生原因差购。
var (
ErrNoErrors = errors.New("課程數(shù)為 0 ")
ErrDuplicateEntry = errors.New("重復記錄")
)
func addTut(t Tut) error{
if t.Courses < 1 {
return ErrNoErrors
}
_, ok := db[t.Title]
if !ok {
return ErrDuplicateEntry
}
db[t.Title] = t
return nil
}
我們可以重構(gòu)一下代碼對代碼進行優(yōu)化,根據(jù)之前定義好錯誤類型進行判斷錯誤來進行輸出汉嗽。
func addTut(t Tut) error{
if t.Courses < 1 {
return ErrNoErrors
}
_, ok := db[t.Title]
if !ok {
return ErrDuplicateEntry
}
db[t.Title] = t
return nil
}
func main() {
db = make(map[string]Tut)
angularTut := Tut{ Title:"angular", Courses: 0}
err := addTut(angularTut)
switch err {
case ErrNoErrors:
fmt.Println("錯誤處理: 課程數(shù)不能為 0 ")
case ErrDuplicateEntry:
fmt.Println("錯誤處理: 該課程已存在無法重復添加")
}
//處理錯誤
angularTwoTut := Tut{ Title:"angular", Courses: 0}
err3 := addTut(angularTwoTut)
if err3 != nil{
}
angularDuplicated := Tut{Title:"angular",Courses:10}
err2 := addTut(angularDuplicated)
switch err2 {
case ErrNoErrors:
fmt.Println("錯誤處理: 課程數(shù)不能為 0 ")
case ErrDuplicateEntry:
fmt.Println("錯誤處理: 該課程已存在無法重復添加")
}
}
import(
"fmt"
"errors"
)
func main() {
const fn = "temp.cpp"
var ln = 19
text := fmt.Sprintf("compile problem with %q: %d",fn,ln)
err := errors.New(text)
if err != nil{
fmt.Println(err)
}
}