如何从MySQL中确定错误类型

7
我很困惑如何从MySQL导入的失败查询行中获取错误类型。目前没有真正的文档说明,所以这让我感到非常困惑。
我有以下内容:
result, err := db.Exec("INSERT INTO users (username,password,email) VALUES (?,?,?)", username, hashedPassword, email)
if err != nil {
    // handle different types of errors here
    return
}

我可以打印错误信息,但它只是一个字符串,不喜欢窥视字符串以了解出了什么问题,有没有反馈来获取错误代码执行switch或类似的操作?你是如何做到的?

2个回答

12
事实上,检查错误字符串内容是一种不好的做法,因为字符串值可能会因驱动程序版本而异。更好和更健壮的方法是比较错误号码以确定特定的错误。

对于mysql驱动程序,有错误代码可用,该软件包与主要驱动程序软件包分开维护。由于这不是database/sql本身的一部分,因此各个驱动程序之间执行此操作的机制是不同的。使用该软件包,您可以检查错误类型MySQLError
if driverErr, ok := err.(*mysql.MySQLError); ok {
    if driverErr.Number == mysqlerr.ER_ACCESS_DENIED_ERROR {
        // Handle the permission-denied error
    }
}

还有错误变量

参考文献


1
你能解释一下第一行发生了什么吗?我从来没有见过那样的语法。这是从error转换为mysql.MySQLError吗?还是一个函数调用?有点让人困惑。 - Sir
1
这是一个类型转换错误,只是一个示例,演示如何从外部包中获取错误并与数字进行比较。 - Roman Kiselenko

3
通常在包中,如果包的作者想要分离错误,就会为每个错误创建变量,例如:https://golang.org/pkg/database/sql/#pkg-variables 你可以看到错误,并且可以在返回和 case 语句中切换错误变量。
示例:
result, err := db.Exec("INSERT INTO users (username,password,email) VALUES (?,?,?)", username, hashedPassword, email)
if err == sql.ErrNoRows {
    // handle error
    return
}
if err == sql.ErrTxDone {
    // handle error
    return
}

更好的选择是使用错误开关,而不是连续的if语句:https://play.golang.org/p/-d_skg2tK- - Kaedys

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接