go【第七篇】异常处理

error接口

error 普通错误 

Go语言引入了一个关于错误处理的标准模式,即error接口,它是Go语言内建的接口类型,该接口的定义如下:

type error interface {
    Error() string
}

Go语言的标准库代码包errors为用户提供如下方法

// Copyright 2011 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Package errors implements functions to manipulate errors.
package errors

// New returns an error that formats as the given text.
func New(text string) error {
    return &errorString{text}
}

// errorString is a trivial implementation of error.
type errorString struct {
    s string
}

func (e *errorString) Error() string {
    return e.s
}
error.go
package main

import "fmt"
import "errors"

func main() {
    //var err1 error = fmt.Errorf("%s", "this is normol err")
    err1 := fmt.Errorf("%s", "this is normal err1")
    fmt.Println("err1 = ", err1)

    err2 := errors.New("this is normal err2")
    fmt.Println("err2 = ", err2)
}
eg
package main

import (
    "errors"
    "fmt"
)

func main() {
    num, err := TestError(10, 0)
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Println(num)
    }
    // os.Open() // ctrl+b 查看go语言自己定义好的方法的源代码。
}

func TestError(num1 int, num2 int) (result int, err error) {
    err = nil
    if num2 == 0 {
        err = errors.New("除数不能为0")
        return
    }
    result = num1 / num2
    return
}
eg2

panic

panic 严重错误

panic异常发生时,程序会中断运行

package main

import "fmt"

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

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

func testc() {
    fmt.Println("cccccccccccccccccc")
}

func main() {
    testa()
    testb()
    testc()
}
显式调用panic

recover

尝试从当前的异常状态恢复过来

package main

import "fmt"

func main() {
    Test(11)
}

func Test(n int) {
    defer TestRecover()
    var num [10] int
    num[n] = 12
    fmt.Println(num)
    fmt.Println("aaaaa")

}

func TestRecover() {
    fmt.Println(recover())
}
/*输出
runtime error: index out of range
*/
View Code
View Code

错误处理流程

golang 有2个内置的函数 panic() 和 recover(),用以主动抛出和捕获运行时发生的程序错误,与 error 不同,panic-recover 一般用在函数内部。

golang 的错误处理流程:

当一个函数在执行过程中出现了异常或遇到 panic(),正常语句就会立即终止,然后执行 defer 语句,再报告异常信息,最后退出 goroutine。

如果在 defer 中使用了 recover() 函数,则会捕获错误信息,使该错误信息终止报告。

一定要注意不要滥用 panic-recover,可能会导致性能问题

 

 

 

 

 

 

 

 

  

posted @ 2018-02-08 10:50  沐风先生  阅读(150)  评论(0编辑  收藏  举报