佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > 淺談Go語(yǔ)言的error類(lèi)型

淺談Go語(yǔ)言的error類(lèi)型

熱門(mén)標(biāo)簽:網(wǎng)站排名優(yōu)化 服務(wù)外包 AI電銷(xiāo) 百度競(jìng)價(jià)排名 鐵路電話系統(tǒng) 呼叫中心市場(chǎng)需求 地方門(mén)戶網(wǎng)站 Linux服務(wù)器

error類(lèi)型是go語(yǔ)言的一種內(nèi)置類(lèi)型,使用的時(shí)候不用特定去import,他本質(zhì)上是一個(gè)接口

 type error interface{
 Error() string //Error()是每一個(gè)訂制的error對(duì)象需要填充的錯(cuò)誤消息,可以理解成是一個(gè)字段Error
}

怎樣去理解這個(gè)訂制呢?

我們知道接口這個(gè)東西,必須擁有它的實(shí)現(xiàn)塊才能調(diào)用,放在這里就是說(shuō),Error()必須得到填充,才能使用.

比方說(shuō)下面三種方式:

第一種:通過(guò)errors包去訂制error

error := errors.New("hello,error")//使用errors必須import "errors"包
if error != nil {
 fmt.Print(err)
}

來(lái)解釋一下errors包,只是一個(gè)為Error()填充的簡(jiǎn)易封裝,整個(gè)包的內(nèi)容,只有一個(gè)New方法,可以直接看

func New(text string) error

第二種:通過(guò)fmt.Errorf()去訂制

err := fmt.Errorf("hello error")
if err != nil {
 fmt.Print(err)
}

可以說(shuō)和第一種雷同了.

第三種:就是通過(guò)自定義的MyError塊去訂制了

//一個(gè)包裹了錯(cuò)誤類(lèi)型對(duì)象的自定義錯(cuò)誤類(lèi)型
type MyError struct {
err error 
}
//訂制Error()
func (e MyError) Error() string {
 return e.err.Error()
}
func main() {
 err:=MyError{
 errors.New("hello error"),
 }
 fmt.Println(err.Error())
}

三種方式差異都不大,輸出結(jié)果都是 hello error

實(shí)際上error只是一段錯(cuò)誤信息,真正拋出異常并不是單純靠error,panic和recover的用法以后總結(jié)。

補(bǔ)充:go error接口與errors包詳解

1 error接口

定義:

 type error interface{
 Error() string //Error()是一個(gè)方法,是每一個(gè)訂制的error對(duì)象需要填充的錯(cuò)誤消息,可以理解成是一個(gè)字段Error
}

1.1 常見(jiàn)調(diào)用方式

模板

n, err := Foo(0) 
 
if err != nil { 
 // 錯(cuò)誤處理 
} else { 
 // 使用返回值 n 
} 

練習(xí)1

package main
import ( 
 "fmt"
 "os"
)
func main() { 
 f, err := os.Open("/test.txt")
 if err != nil {
  fmt.Println(err)
  return
 }
 fmt.Println(f.Name(), "opened successfully")
}

[root@localhost error]# go run err3.go

open /test.txt: no such file or directory

1.2 自定義error方法

1.2.1 函數(shù)調(diào)用error

func Foo(param int)(n int, err error) { 
 // ... 
} 

1.2.2 自定義Error模板1

type fileError struct {
}
func (fe *fileError) Error() string {
 return "文件錯(cuò)誤"
}

練習(xí)1

模擬一個(gè)錯(cuò)誤

package main
import "fmt"
type fileError struct {
}
func (fe *fileError) Error() string { //自定義會(huì)覆蓋原來(lái)的Error接口
 return "文件錯(cuò)誤"
}
//只是模擬一個(gè)錯(cuò)誤
func openFile() ([]byte, error) {
 return nil, fileError{}
}
func main() {
 conent, err := openFile()
 if err != nil {
  fmt.Println(err)
 } else {
  fmt.Println(string(conent))
 }
}

[root@localhost error]# go run err1.go

文件錯(cuò)誤

1.2 自定義Error模板2

自定義中添加一個(gè)字符串

type fileError struct {
 s string
}
func (fe *fileError) Error() string {
 return fe.s
}

練習(xí)2

聲明fileError的時(shí)候,設(shè)置好要提示的錯(cuò)誤文字

package main
import "fmt"
type fileError struct {
 s string
}
func (fe *fileError) Error() string {
 return fe.s
}
//只是模擬一個(gè)錯(cuò)誤
func openFile() ([]byte, error) {
 return nil, fileError{"文件錯(cuò)誤,自定義"} 
}
func main() {
 conent, err := openFile()
 if err != nil {
  fmt.Println(err)
 } else {
  fmt.Println(string(conent))
 }
}

[root@localhost error]# go run err2.go

文件錯(cuò)誤,自定義

練習(xí)3

添加一個(gè)時(shí)間刻度

package main
import (
 "fmt"
 "time"
)
type MyError struct {
 When time.Time
 What string
}
func (e MyError) Error() string {
 return fmt.Sprintf("%v: %v", e.When, e.What)
}
func oops() error {
 return MyError{
  time.Date(1989, 3, 15, 22, 30, 0, 0, time.UTC),
  "the file system has gone away",
 }
}
func main() { 
 if err := oops(); err != nil { 
  fmt.Println(err) 
 }
}

[root@localhost error]# go run err4.go

1989-03-15 22:30:00 +0000 UTC: the file system has gone away

練習(xí)三

沒(méi)有打開(kāi)文件報(bào)錯(cuò)

package main
import (
 "fmt"
 "os"
)
type PathError struct {
 Op string
 Path string
 Err error
}
func (e *PathError) Error() string { 
  return e.Op + " " + e.Path + ": " + e.Err.Error() 
} 
func main() {
 f, err := os.Open("/test.txt")
 if errObject, ok := err.(*os.PathError); ok {
 fmt.Println("錯(cuò)誤輸出:",err, "文件路徑:", errObject.Path)
 return
 }
 fmt.Println(f.Name(), "opened successfully")
} 

[root@localhost error]# go run err5.go

錯(cuò)誤輸出: open /test.txt: no such file or directory 文件路徑: /test.txt

2 errors包

2.1 獲取error包

go get github.com/pkg/errors

2.2 errors.New()

errors.New()接收合適的錯(cuò)誤信息來(lái)創(chuàng)建

先聲明再使用

l練習(xí)1

package main
import (
 "errors"
 "fmt"
)
var errNotFound error = errors.New("Not found error")
func main() {
 fmt.Printf("error: %v", errNotFound)
}

[root@localhost error]# go run errs1.go

error: Not found error

練習(xí)2

函數(shù)如何調(diào)用err

直接使用

package main
import (
 "errors"
 "fmt"
)
func Sqrt(f float64) (float64, error) {
  if f  0 {
   return 0, errors.New("math - square root of negative number")
  }else {
   return 1, errors.New("math - square root of 10")
  }
}
func main() {
 if _, err := Sqrt(-1); err != nil {
  fmt.Printf("Error: %s\n", err)
 }
}

[root@localhost error]# go run errs2.go

Error: math - square root of negative number

3 自定義error與errors.New()使用比較

比較自定義error與errors.New()函數(shù)根據(jù)需求其實(shí)各有優(yōu)點(diǎn)。

package main
import (
 "errors"
 "fmt"
)
type MsgError struct {
 Code int
 Msg string
}
func (msg *MsgError) Error() string {
 return fmt.Sprintf("%s", msg.Msg)
}
func f1(code int) (int, error) {
 if code == 1 {
 return -1, errors.New("msg test error")
 }
 return code, nil
}
func f2(code int) (int, error) {
 if code == 1 {
 return -1, MsgError{code, "struct msg test error"}
 }
 return code, nil
}
func main() {
 for _, v := range []int{1, 2, 3, 4, 5, 6} {
  if code, err := f1(v); err != nil {
 fmt.Println(err)
 } else {
 fmt.Println("success:", code)
 }
 }
 for _, i := range []int{1, 2, 3} {
 if code, err := f2(i); err != nil {
 fmt.Println(err)
 } else {
 fmt.Println("success:", code)
 }
 }
}
[root@localhost error]# go run errs3.go
msg test error
success: 2
success: 3
success: 4
success: 5
success: 6
struct msg test error
success: 2
success: 3

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • GO語(yǔ)言標(biāo)準(zhǔn)錯(cuò)誤處理機(jī)制error用法實(shí)例
  • Go 自定義error錯(cuò)誤的處理方法
  • golang 打印error的堆棧信息操作
  • 淺析golang開(kāi)發(fā)Error的使用詳解
  • Go應(yīng)用中優(yōu)雅處理Error的技巧總結(jié)

標(biāo)簽:衡水 崇左 銅川 仙桃 黃山 蘭州 湖南 湘潭

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《淺談Go語(yǔ)言的error類(lèi)型》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    红原县| 广州市| 双城市| 保山市| 宝兴县| 司法| 石河子市| 方正县| 皮山县| 新津县| 镇赉县| 威宁| 宁明县| 乐安县| 安西县| 宁乡县| 鄯善县| 许昌市| 岫岩| 乌拉特后旗| 阿坝县| 镇雄县| 阜平县| 平定县| 大石桥市| 天门市| 平武县| 泸定县| 京山县| 三原县| 雅安市| 新田县| 会昌县| 阿勒泰市| 铜梁县| 怀化市| 永济市| 彝良县| 保定市| 延寿县| 桂阳县|