go--panic--recover中error返回

2021-12-03  本文已影响0人  w_dll

问题

参考文章
https://segmentfault.com/q/1010000007320304
由于golang没有try catch 捕获异常
通过defer 在panic前 提前把error 获取即可
其中error 需要制定返回变量

code

// 通过命令行获取数据库配置
func GetUimageDbByCmd(config_name string) (msql_cfg MySql, err error) {
    defer func() {
        if r := recover(); r != nil {
            //check exactly what the panic was and create error.
            switch x := r.(type) {
            case string:
                err = errors.New(x)
            case error:
                err = x
            default:
                err = errors.New("unknow panic")
            }
        }
    }()
    // 配置文件里读取所有的数据库信息
    mysql_list, err := GetUpHostImagesMySqlConfig(config_name)
    if err != nil {
        return MySql{}, err
    }
    end_tag := ""
    for index, value := range mysql_list {
        if (index % 2) == 0 {
            end_tag = "  "
        } else {
            end_tag = " \n"
        }
        fmt.Print(index, value.Name, value.Host, end_tag)
    }
    // 命令行交互
    reader := bufio.NewReader(os.Stdin)
    fmt.Print("请输入选择的数据库: ")
    mysql_index, err := reader.ReadString('\n')
    if err != nil {
        // fmt.Fprintln(os.Stderr, err)
        return MySql{}, nil
    }
    mysql_index = strings.TrimSuffix(mysql_index, "\n")
    mysql_index_int, err := strconv.Atoi(mysql_index)
    if err != nil {
        return MySql{}, nil
    }
    msql_cfg = mysql_list[mysql_index_int]
    // 返回前 defer判断是否有 error
    return
}
上一篇 下一篇

猜你喜欢

热点阅读