日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁(yè) > 科技  > 軟件

司空見(jiàn)慣的錯(cuò)誤檢測(cè),原來(lái)還有這么多干貨!

來(lái)源: 責(zé)編: 時(shí)間:2024-02-01 12:48:22 196觀看
導(dǎo)讀一、錯(cuò)誤處理機(jī)制Go 語(yǔ)言以結(jié)果多值返回方式處理錯(cuò)誤,函數(shù)或者方法最后一個(gè)返回值作為錯(cuò)誤類型。func ReadFile(filename string) ([]byte, error)調(diào)用時(shí)根據(jù)錯(cuò)誤值判斷是否正常data, err := ReadFile("abc.txt")if e

一、錯(cuò)誤處理機(jī)制

Go 語(yǔ)言以結(jié)果多值返回方式處理錯(cuò)誤,函數(shù)或者方法最后一個(gè)返回值作為錯(cuò)誤類型。03p28資訊網(wǎng)——每日最新資訊28at.com

func ReadFile(filename string) ([]byte, error)

調(diào)用時(shí)根據(jù)錯(cuò)誤值判斷是否正常03p28資訊網(wǎng)——每日最新資訊28at.com

data, err := ReadFile("abc.txt")if err != nil {    // 處理錯(cuò)誤} else {   // 處理data}

1. error 類型及其意義

Go 語(yǔ)言通過(guò)內(nèi)置的 error 類型實(shí)現(xiàn)錯(cuò)誤處理,它是一個(gè)接口03p28資訊網(wǎng)——每日最新資訊28at.com

type error interface {    Error() string}

實(shí)現(xiàn) error 的類型都可以作為錯(cuò)誤類型返回,框架會(huì)使用 Error()方法打印錯(cuò)誤信息。03p28資訊網(wǎng)——每日最新資訊28at.com

任意類型只要實(shí)現(xiàn)該接口就表示一個(gè)錯(cuò)誤03p28資訊網(wǎng)——每日最新資訊28at.com

type ParseError struct {    Filename string // 文件名    Line     int    // 錯(cuò)誤行號(hào)}func (e *ParseError) Error() string {    return fmt.Sprintf("%s:%d", e.Filename, e.Line)  }

2. if err != nil 檢查錯(cuò)誤

if 語(yǔ)句常用于判斷函數(shù)調(diào)用是否發(fā)生錯(cuò)誤03p28資訊網(wǎng)——每日最新資訊28at.com

file, err := os.Open("/tmp/abc.txt")if err != nil {    log.Fatal(err)}

3. 自定義錯(cuò)誤類型

可自定義錯(cuò)誤類型保存更多信息,自定義錯(cuò)誤能更好表達(dá)錯(cuò)誤場(chǎng)景,修正錯(cuò)誤也更方便。03p28資訊網(wǎng)——每日最新資訊28at.com

type NotFoundError struct {    FileName string}func (e *NotFoundError) Error() string {    return fmt.Sprintf("%s not found", e.FileName)}func find(filename string) error {    _, err := os.Stat(filename)    if err != nil {        // 創(chuàng)建自定義錯(cuò)誤類型并返回        return &NotFoundError{filename}     }    return nil}

調(diào)用時(shí)可以轉(zhuǎn)換回來(lái)03p28資訊網(wǎng)——每日最新資訊28at.com

err := find("hello.txt")if e, ok := err.(*NotFoundError); ok {    fmt.Println(e.FileName) }

二、defer 處理資源釋放問(wèn)題

Go 語(yǔ)言中的 defer 語(yǔ)句會(huì)將函數(shù)執(zhí)行推遲到外層函數(shù)返回之前。03p28資訊網(wǎng)——每日最新資訊28at.com

1. defer 的執(zhí)行規(guī)則與特點(diǎn)

defer 延遲調(diào)用遵循 FILO 規(guī)則。03p28資訊網(wǎng)——每日最新資訊28at.com

func main() {  defer fmt.Println(1)   defer fmt.Println(2)  fmt.Println(3)   // 輸出順序是 3,2,1。}

defer 語(yǔ)句中的變量在定義時(shí)求值(輸出是 1,不是 2。)03p28資訊網(wǎng)——每日最新資訊28at.com

func main() {  x := 1  defer fmt.Println(x)    x++      }

2. defer 釋放資源

defer 經(jīng)常用于釋放資源,不管 process 返回與否,都能保證文件關(guān)閉。03p28資訊網(wǎng)——每日最新資訊28at.com

func main() {  file := openFile("abc.txt")  defer file.Close()    process(file) // 使用文件}

3. defer 經(jīng)典案例

讀取文件內(nèi)容的示例,輸出完內(nèi)容后,defer 確保文件正確關(guān)閉。03p28資訊網(wǎng)——每日最新資訊28at.com

func cat(f string) error {    file, err := os.Open(f)     if err != nil {        return err    }    defer file.Close()         stat, err := file.Stat()    if err != nil {        return err    }        bs := make([]byte, stat.Size())    _, err = file.Read(bs)    if err != nil {       return err     }        fmt.Println(string(bs))    return nil}

03p28資訊網(wǎng)——每日最新資訊28at.com

 三、panic 和 recover

panic 用于程序未能處理的錯(cuò)誤,recover 可以讓 panic 跳出的 goroutine 恢復(fù),防止整個(gè)程序崩潰。03p28資訊網(wǎng)——每日最新資訊28at.com

1. panic、defer 和 recover 的關(guān)系

  • panic 會(huì)導(dǎo)致當(dāng)前 goroutine 立即中止執(zhí)行,但 defer 保證執(zhí)行
  • recover 可以捕獲 panic,從而影響應(yīng)用恢復(fù)

2. recover 捕獲 panic

recover 只在 defer 內(nèi)調(diào)用時(shí)有效03p28資訊網(wǎng)——每日最新資訊28at.com

func ProtectRun(entry func()) {   defer func() {       // 捕獲函數(shù)異常       if r := recover(); r != nil {           log.Printf("run time panic: %v", r)       }   }()   entry() // 可能引發(fā)panic的函數(shù)}

3. panic 應(yīng)用場(chǎng)景

不希望看到 panic,但它也有合理應(yīng)用場(chǎng)景03p28資訊網(wǎng)——每日最新資訊28at.com

// 非法狀態(tài),不可能恢復(fù)panic("invalid state") // 參數(shù)校驗(yàn)未過(guò),不應(yīng)繼續(xù)// 等于“拋出異常”,讓程序停下。if x <= 0 {  panic("x must > 0") }

03p28資訊網(wǎng)——每日最新資訊28at.com

 四、日志的最佳實(shí)踐

log 包實(shí)現(xiàn)日志收集,支持輸出到文件,網(wǎng)絡(luò)等地方。03p28資訊網(wǎng)——每日最新資訊28at.com

1. log 包的基本使用

導(dǎo)入 log 包并設(shè)置輸出位置03p28資訊網(wǎng)——每日最新資訊28at.com

func main() {    log.SetOutput(os.Stdout)        log.Println("logging example")}

2. 設(shè)置日志級(jí)別,控制日志輸出

log 級(jí)別包含 Debug、Info、Warning、Error、Fatal 等。03p28資訊網(wǎng)——每日最新資訊28at.com

log.SetPrefix("[Debug] ")log.SetFlags(log.Llongfile | log.LUTC) log.Println("debug message") log.Fatalln("fatal message")

Fatal 會(huì)在寫入日志后調(diào)用 os.Exit(1)。03p28資訊網(wǎng)——每日最新資訊28at.com

3. 將日志寫入文件,按文件大小切分

默認(rèn)日志只輸出到 stderr,可以寫入文件,超過(guò)文件限制后,將日志保存到 xx.log.1。03p28資訊網(wǎng)——每日最新資訊28at.com

f, _ := os.OpenFile("/tmp/xx.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644) log.SetOutput(f)

03p28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-70417-0.html司空見(jiàn)慣的錯(cuò)誤檢測(cè),原來(lái)還有這么多干貨!

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 高并發(fā)秒殺方案:熱點(diǎn)散列,庫(kù)存分桶,你需要了解一下

下一篇: Nuxt 3.10 正式發(fā)布,看看有什么變化!

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 主站蜘蛛池模板: 大宁县| 菏泽市| 恩平市| 建湖县| 琼结县| 安岳县| 乌审旗| 延川县| 乌鲁木齐市| 陇西县| 徐闻县| 安平县| 安国市| 奉节县| 开鲁县| 苍南县| 萨迦县| 清苑县| 临清市| 昭平县| 北京市| 台州市| 鹤壁市| 伽师县| 金秀| 铁岭市| 利辛县| 广饶县| 长岛县| 虎林市| 福州市| 边坝县| 福贡县| 青海省| 沭阳县| 阜新市| 泗水县| 永宁县| 邵武市| 平度市| 台北县|