错误

错误

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:内置得数据类型,内置的接口
        定义的方法:Error() string

    使用go语言提供好的包:
        errors包下的函数:New(),创建一个error对象
        fmt包下得Errorf()函数:
            func Error(format string,a ...interface{}) error
    */

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

    //另一个创建error得方法
    err2 := fmt.Errorf("错误信息码:%d",100)
    fmt.Println(err2)
    fmt.Errorf("%T\n",err2)


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

}

//设计一个函数,验证年龄是否合法
func checkAge(age int) error {
    if age < 0 {
        return errors.New("年龄不合法")
    }
    fmt.Println("年龄是:",age)
    return nil
}


错误类型表示

package main

import (
    "fmt"
    "os"
)

//44
func main() {

    /*
        错误类型表示
    */

    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() {

    /*
        错误类型表示
    */

    addr,err := net.LookupHost("www.baidu.com")
    fmt.Println(err)  //<nil>
    if ins,ok := err.(*net.DNSError);ok {
        if ins.Timeout() {
            fmt.Println("操作超时")
        } else if ins.Temporary() {
            fmt.Println("临时性错误")
        } else {
            fmt.Println("通常错误")
        }
    }
    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 提供的解析模式错误
        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)
        // 使用断言获得非法数据
        if err,ok := err.(*areaError);ok {
            fmt.Printf("半径是:%.2f\n",err.radius)
        }
        return
    }
    fmt.Println("圆形的半径是:",area)


}

//定义一个结构体,表示错误得类型
type areaError struct {
    msg string
    radius float64
}

//2. 实现error接口,就是实现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("我是第一个函数funA")
}

func funB() { //外围函数

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

    fmt.Println("我是函数funB")
    defer myprint("defer funB()1.....")
    for i:=1;i<=10;i++ {
        fmt.Println("i:",i)
        //让程序中断
        if i == 5 {
            panic("funB函数,恐慌")
        }
    }
    //当外围函数代码中发生了恐慌,只有其中所有的defer得函数全部执行完毕后,才会被传到函数的调用出
    defer myprint("defer funB()2.....")
}
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352

推荐阅读更多精彩内容