一个程序猿的奋斗史php开发

Go语言学习笔记16.异常处理

2019-11-06  本文已影响0人  快乐的提千万

error接口

type error interface {
    Error() string
}
package errors

type errorString struct { 
    text string 
}

func New(text string) error { 
    return &errorString{text} 
}

func (e *errorString) Error() string { 
    return e.text 
}

使用:

package main

import "fmt"
import "errors"

//函数通常在最后的返回值中返回错误信息:
func MyDiv(a, b int) (result int, err error) {
    err = nil
    if b == 0 {
        err = errors.New("分母不能为0")
    } else {
        result = a / b
    }

    return
}

func main() {
    //利用fmt打印错误 
    err1 := fmt.Errorf("%s", "this is normal err1")
    fmt.Println("err1 = ", err1)

    err2 := errors.New("this is normal err2")
    fmt.Println("err2 = ", err2)

    test := err2.Error()
    fmt.Println("test = ", test)

    //调用函数的时候同时接收错误信息
    result, err := MyDiv(10, 0)
    if err != nil {
        fmt.Println("err = ", err)
    } else {
        fmt.Println("reslut = ", result)
    }

}

panic和recover

panic属于异常,比如数组访问越界、空指针引用,如果显示调用panic也能触发,通常用来记录会导致系统崩溃的问题。
recover则是用来接收这种异常。但是recover只有在defer调用的函数中有效。
如果调用了内置函数recover,并且定义该defer语句的函数发生了panic异常,recover会使程序从panic中恢复,并返回panic value。导致panic异常的函数不会继续运行,但能正常返回。在未发生panic时调用recover,recover会返回nil。

package main

import "fmt"

func testa() {
    fmt.Println("aaaaaaaaaaaaaaaaa")
}

func testb(x int) {
    
    //设置recover
    defer func() {
        //用err变量接收错误信息,返回给调用者
        if err := recover(); err != nil { //产生了panic异常
            fmt.Println(err) //runtime error: index out of range
        }

    }() //别忘了(), 调用此匿名函数

    var a [10]int
    a[x] = 111 //当x为20时候,导致数组越界,产生一个panic,导致程序崩溃
}

func testc() {
    //显式调用panic函数,导致程序中断
    panic("this is a panic test")
}

func main() {
    testa()
    testb(20)
    testc()
}
上一篇下一篇

猜你喜欢

热点阅读