FreezeJ' Blog

Go处理不同异常

2022-03-15

使用switch case语句,匹配不同异常实现不同处理。

package main

import (
    "fmt"
    "time"
)

type normalError struct {
    msg string
}

func (n normalError) Error() string {
    return n.msg
}

type specialError struct {
    msg    string
    date   string
    detail string
}

func (s specialError) Error() string {
    return s.detail
}

func count(num int) (int, error) {
    if num <= 0 {
        return 0, normalError{msg: "输入数字小于等于0,请重新输入!"}
    } else if num > 999 {
        return 0, specialError{
            msg:    "输入数字大于999",
            date:   time.Now().Format("2006-01-02 14:04:15"),
            detail: fmt.Sprintf("你输入的数字为%d,大于最大值999", num),
        }
    } else {
        return num + 1, nil
    }
}

func loopCount() {
    var num int
    fmt.Print("请输入整数(0 < num < 999):")
    // 处理输入异常
    _, err := fmt.Scan(&num)
    switch err.(type) {
    case nil:
        // 处理函数异常
        result, err := count(num)
        switch err := err.(type) {
        case nil:
            fmt.Println("没有异常")
            fmt.Println("结果为:", result)
        case specialError:
            fmt.Println("特殊异常")
            fmt.Printf("错误时间:%s,错误详情:%s\n", err.date, err.detail)
        case normalError:
            fmt.Println("普通异常")
            fmt.Println(err.msg)
        default:
            fmt.Println("未知异常")
            fmt.Println(err)
        }
    default:
        fmt.Println(err)
    }

}

func main() {
    for {
        loopCount()
    }
}

输出:

请输入整数(0 < num < 999):-10
普通异常
输入数字小于等于0,请重新输入!
请输入整数(0 < num < 999):0
普通异常
输入数字小于等于0,请重新输入!
请输入整数(0 < num < 999):10
结果为: 11
请输入整数(0 < num < 999):1000
特殊异常
错误时间:2022-03-15 317:17:14,错误详情:你输入的数字为1000,大于最大值999

Tags: GO