如何从 MySQL 中确定错误类型
Posted
技术标签:
【中文标题】如何从 MySQL 中确定错误类型【英文标题】:How to determine the error type from MySQL 【发布时间】:2018-04-11 01:37:35 【问题描述】:我真的很困惑如何通过 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
我可以打印 err 但它只是一个字符串,不喜欢偷看字符串以知道出了什么问题的想法,是否没有反馈来获取错误代码以执行 switch
或类似的事情?你是怎么做到的?
【问题讨论】:
【参考方案1】:确实,检查错误字符串的内容是一种不好的做法,字符串值可能会因驱动程序版本而异。比较错误编号以确定具体错误是什么,这样会更好、更可靠。
mysql驱动有错误码,package与主驱动包分开维护。但是,执行此操作的机制因驱动程序而异,因为这不是 database/sql 本身的一部分。使用该软件包,您可以检查错误类型MySQLError
:
if driverErr, ok := err.(*mysql.MySQLError); ok
if driverErr.Number == mysqlerr.ER_ACCESS_DENIED_ERROR
// Handle the permission-denied error
还有错误variables
。
Ref
【讨论】:
你能解释一下第一行发生了什么吗?我从未见过这样的语法。它是从error
到mysql.MySQLError
的转换吗?或者这是一个函数调用..有点混乱。
这是一个错误类型转换,它只是一个如何获取错误并与外部包中的数字进行比较的示例。【参考方案2】:
通常在包中,如果包作者想要分隔错误,则可以看到变量,为每个错误创建变量,例如: https://golang.org/pkg/database/sql/#pkg-variables
您可以看到错误,您可以切换错误作为返回值,并对每个错误变量进行大小写。
示例:
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 语句:play.golang.org/p/-d_skg2tK-以上是关于如何从 MySQL 中确定错误类型的主要内容,如果未能解决你的问题,请参考以下文章