我如何除了特定种类的pymysql.err.InternalErrors,而不仅仅是所有这些?

时间:2017-01-08 22:36:11

标签: python error-handling

我正在写一个函数,可以在我的数据库中添加一个新表。我遇到的问题是当表已经存在时,我收到错误消息:

pymysql.err.InternalError: (1050, "Table 'doesthiswork' already exists")

所以我在我的代码中添加了一个除外,但它除了所有内部错误外都有效。如何获取我的代码,除了我假设的具体错误是1050而不是内部错误?

import pymysql

def CreateTable(Host,User,Password,DataBase,TableName):

    try:
        conn = pymysql.connect(
                           host = Host,
                           user = User,
                           password= Password,
                           db = DataBase
                          )
        a = conn.cursor()
        tblName = TableName
        sql = 'CREATE TABLE'+" "+ tblName + '(try varchar(128));'

        a.execute(sql)

    except pymysql.err.InternalError: 
        print (tblName + " " + 'already exist')

上面的代码有效,但如前所述,如果出现了不同类型的内部错误,那么除了表已经存在而不是实际错误本身之外。

3 个答案:

答案 0 :(得分:6)

将异常分配给变量并测试特定的错误代码,例如:

except pymysql.err.InternalError as e:
    code, msg = e.args
    if code == 1050:
        print(tblName, 'already exists')

虽然你可能只是print(msg)

答案 1 :(得分:3)

您不必对代码值进行硬编码,它们可以在pymysql.constants.ER module中找到。并且您可以在错误代码和错误消息之间建立映射,这有助于扩展此方法以处理更多错误,而无需乘以if / else块:

from pymysql.constants import ER

error_codes = {
   ER.TABLE_EXISTS_ERROR: "Table already exists",
   ER.ACCESS_DENIED_ERROR: "Access denied"
}

try:
    # ...
except pymysql.err.InternalError as e:
    code, msg = e.args
    print(error_codes.get(code, msg))

答案 2 :(得分:0)

您可以像这样添加额外的全部“除外”:

try:
    # your code here
except pymysql.err.InternalError:
    print('already exists')
except:
    print('catch-all exception!')