錯(cuò)誤

錯(cuò)誤

package main

import (
    "errors"
    "fmt"
)

//43
func main() {
    //f,err := os.Open("test.txt")
    //if err != nil {
    //  // log.Fatal(err) //2020/03/11 10:27:38 open test.txt: The system cannot find the file specified.
    //  fmt.Println(err) //open test.txt: The system cannot find the file specified.
    //  return
    //}
    //fmt.Println(f.Name(),"打開文件成功")

    /*
    error:內(nèi)置得數(shù)據(jù)類型,內(nèi)置的接口
        定義的方法:Error() string

    使用go語(yǔ)言提供好的包:
        errors包下的函數(shù):New(),創(chuàng)建一個(gè)error對(duì)象
        fmt包下得Errorf()函數(shù):
            func Error(format string,a ...interface{}) error
    */

    err1 := errors.New("自己創(chuàng)建玩的...")
    fmt.Println(err1) //自己創(chuàng)建玩的...
    fmt.Printf("%T\n",err1) //*errors.errorString

    //另一個(gè)創(chuàng)建error得方法
    err2 := fmt.Errorf("錯(cuò)誤信息碼:%d",100)
    fmt.Println(err2)
    fmt.Errorf("%T\n",err2)


    err3 := checkAge(-1)
    if err3 != nil {
        fmt.Println(err3)
        return
    }
    fmt.Println("...........")

}

//設(shè)計(jì)一個(gè)函數(shù),驗(yàn)證年齡是否合法
func checkAge(age int) error {
    if age < 0 {
        return errors.New("年齡不合法")
    }
    fmt.Println("年齡是:",age)
    return nil
}


錯(cuò)誤類型表示

package main

import (
    "fmt"
    "os"
)

//44
func main() {

    /*
        錯(cuò)誤類型表示
    */

    f,err := os.Open("test.txt")
    if err != nil {
        fmt.Println(err)
        if ins,ok := err.(*os.PathError);ok {
            fmt.Println("1.0p:",ins.Op) //1.0p: open
            fmt.Println("2.Path",ins.Path) //2.Path test.txt
            fmt.Println("3.Err:",ins.Err) //3.Err: The system cannot find the file specified.
        }
        return
    }
    fmt.Println(f.Name(),"打開文件成功")

    

}
package main

import (
    "fmt"
    "net"
    "path/filepath"
)

//45
func main() {

    /*
        錯(cuò)誤類型表示
    */

    addr,err := net.LookupHost("www.baidu.com")
    fmt.Println(err)  //<nil>
    if ins,ok := err.(*net.DNSError);ok {
        if ins.Timeout() {
            fmt.Println("操作超時(shí)")
        } else if ins.Temporary() {
            fmt.Println("臨時(shí)性錯(cuò)誤")
        } else {
            fmt.Println("通常錯(cuò)誤")
        }
    }
    fmt.Println(addr) //[39.156.66.18 39.156.66.14]

    files,err := filepath.Glob("[")
    if err != nil && err == filepath.ErrBadPattern {
        fmt.Println(err) //syntax error in pattern 提供的解析模式錯(cuò)誤
        return
    }
    fmt.Println("files:",files)

}

自定義error

package main

import (
    "fmt"
    "math"
)

//46
func main() {

    /*
        自定義error
    */
    radius := -3.0
    area,err := circleArea(radius)
    if err!= nil {
        fmt.Println(err)
        // 使用斷言獲得非法數(shù)據(jù)
        if err,ok := err.(*areaError);ok {
            fmt.Printf("半徑是:%.2f\n",err.radius)
        }
        return
    }
    fmt.Println("圓形的半徑是:",area)


}

//定義一個(gè)結(jié)構(gòu)體,表示錯(cuò)誤得類型
type areaError struct {
    msg string
    radius float64
}

//2. 實(shí)現(xiàn)error接口,就是實(shí)現(xiàn)Error()方法
func (e *areaError) Error() string {
    return fmt.Sprintf("error:半徑,&.2f,%s",e.radius,e.msg)
}

func circleArea(radius float64)(float64,error) {
    if radius < 0 {
        return 0,&areaError{"半徑非法",radius}
    }
    return math.Pi * radius * radius,nil
}

panic和recover

package main

import "fmt"

//47
func main() {

    /*
        panic 和 recover

    */

    funA()
    defer myprint("defer main3......")

    funB()
    defer myprint("defer main4......")

    fmt.Println("main over...")

}

func myprint(s string) {
    fmt.Println(s)
}

func funA() {
    fmt.Println("我是第一個(gè)函數(shù)funA")
}

func funB() { //外圍函數(shù)

    defer func() {
        if msg := recover();msg != nil {
            fmt.Println(msg,"程序恢復(fù)了")
        }
    }()

    fmt.Println("我是函數(shù)funB")
    defer myprint("defer funB()1.....")
    for i:=1;i<=10;i++ {
        fmt.Println("i:",i)
        //讓程序中斷
        if i == 5 {
            panic("funB函數(shù),恐慌")
        }
    }
    //當(dāng)外圍函數(shù)代碼中發(fā)生了恐慌,只有其中所有的defer得函數(shù)全部執(zhí)行完畢后,才會(huì)被傳到函數(shù)的調(diào)用出
    defer myprint("defer funB()2.....")
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容