Go语言基础-异常处理

package main

import (
    "fmt"
)

// 在 Golang 中,错误处理机制一般是函数返回时使用的,是对外的接口,而异常处理机制 panic-recover 一般用在函数内部。
// error 类型介绍
// error 类型实际上是抽象了 Error() 方法的 error 接口,Golang 使用该接口进行标准的错误处理。

type dualError struct {
    Num int

    problem string
}

func (e dualError) Error() string {
    return fmt.Sprintf("参数不正确,因为\"%d\"不是双数", e.Num)
}

func requireDual(n int) (int, error) {

    if n&1 == 1 {

        return -1, dualError{Num: n}

    }
    return n, nil

}

// defer 在声明时不会立即执行,而是在函数 return 后,
// 再按照 FILO (先进后出)的原则依次执行每一个 defer,
// 一般用于异常处理、释放资源、清理数据、记录日志等。这有点像面向对象语言的析构函数,优雅又简洁,
// 是 Golang 的亮点之一。
// 即便函数抛出了异常,也会被执行的。 这样就不会因程序出现了错误,而导致资源不会释放了。

func fn(n int) int {
    defer func() {
        n++
        fmt.Println("3st:", n)
    }()
    defer func() {
        n++
        fmt.Println("2st:", n)
    }()
    defer func() {
        n++
        fmt.Println("1st:", n)
    }()
    return n //没有做任何事情
}

func main() {

    // 错误处理

    if result, err := requireDual(101); err != nil {

        fmt.Println("错误:", err)

    } else {

        fmt.Println("结果:", result)

    }

    // 延迟函数defer

    fmt.Println("函数返回值:", fn1(0))

}

 

 

package main

import (
    "log"

    "strconv"
)

// Golang 有2个内置的函数 panic() 和 recover(),
// 用以报告和捕获运行时发生的程序错误,与 error 不同,
// panic-recover 一般用在函数内部。一定要注意不要滥用 panic-recover,
// 可能会导致性能问题,我一般只在未知输入和不可靠请求时使用。

// golang 的错误处理流程:当一个函数在执行过程中出现了异常或遇到 panic(),
// 正常语句就会立即终止,然后执行 defer 语句,再报告异常信息,最后退出 goroutine。
// 如果在 defer 中使用了 recover() 函数,则会捕获错误信息,使该错误信息终止报告。

//捕获因未知输入导致的程序异常

func catch(nums ...int) int {

    defer func() {

        if r := recover(); r != nil {

            log.Println("[E]", r)

        }

    }()
    return nums[1] * nums[2] * nums[3] //index out of range

}

//主动抛出 panic,不推荐使用,可能会导致性能问题

func toFloat64(num string) (float64, error) {

    defer func() {

        if r := recover(); r != nil {

            log.Println("[W]", r)

        }

    }()
    if num == "" {

        panic("param is null") //主动抛出 panic

    }
    return strconv.ParseFloat(num, 10)

}
func main() {

    catch(2, 8)

    toFloat64("")

}

你可能感兴趣的:(Go语言基础-异常处理)