Go-24-异常处理机制

error 接口

type error interface(){
      Error() string  
}

在Go语言中处理错误的方式通常是将返回的错误与nil进行比较。nil值表示没有发生错误,而非nil值表示出现错误。如果不是nil,需打印输出错误。

package main

import (
    "errors"
    "fmt"
    "math"
)

// 异常处理机制 error 接口
func main() {
    num,err:=Sqrt(-100)
    if err!=nil{
        fmt.Println(err)
    }else{
        fmt.Println(num)
    }
}
// 定义平法根,算术运算
func Sqrt(num float64)(float64,error){
    if num>0 {
        return math.Sqrt(num),nil
    }else {
        return 0,errors.New("负数不可以求算术平方根")
    }
}

自定义接口类型:

step1: 定义一个结构体,表示自定义错误的类型。

step2:让自定义错误类型实现error接口:Error() string。

step3:定义一个返回error的函数。根据程序实际功能而定。

package main

import (
    "fmt"
    "strings"
)

//step 1:自定义错误结构体
type MyError struct {
    err string
}
// step2:让自定义错误类型实现error接口:Error() string
func (e MyError) Error() string{
    return e.err
}
// step3: 定义一个返回error的方法
func test(str string) (string,error){
    if strings.EqualFold(str,"err"){
        return "",MyError{"传入的字符串不可以是err"}
    }
    return str,nil
}
func main() {
    str,err:=test("err")
    if err!=nil {
        fmt.Println(err)
    }else {
        fmt.Println(str)
    }
}

defer函数

关键字defer用于延迟一个函数或者方法的执行。defer语句只能出现在函数或方法的内部。

在函数中可以添加多个defer语句。如果有很多调用defer,当函数执行到最后时,这些defer语句会按照逆序执行(报错的时候也会执行),最后该函数返回。

package main

import "fmt"

//defer 推迟方法的执行
func main() {
    defer A()
    B()
    defer C()
    fmt.Println("end----------")
}
func A()  {
    fmt.Println("A-----------")
}
func B()  {
    fmt.Println("B-----------")
}
func C(){
    fmt.Println("C-----------")
}

延迟函数的参数在执行延迟语句时被执行,而不是在执行实际的函数调用时执行。

当一个函数有多个延迟调用时,它们被添加到一个堆栈中,并按后进先出(Last In First Out,LIFO)的顺序执行.

panic和recover机制

不应通过调用panic()函数来报告普通的错误,而应该只把它作为报告致命错误的一种方式。当某些不应该发生的场景发生时调用panic()

Go语言为开发者提供了专用于“拦截”运行时panic的内建函数recover()。recover()可以让进入恐慌流程的Goroutine恢复过来并重新获得流程控制权。

recover() 只在推迟函数种有效。

 

posted @ 2020-05-30 13:29  sixinshuier  阅读(172)  评论(0编辑  收藏  举报