2016-12-27 120 views
3

我的問題關於異常最佳實踐。 我會用PyMySQL在特定情況下提出我的問題,但它通常會處理錯誤。 我正在使用PyMySQL,並且在許多可能的例外中,有一個我想以特定方式處理。 「重複」異常。根據下表處理PyMySql異常 - 最佳實踐

pymysql地圖mysql的錯誤蟒蛇錯誤:

_map_error(ProgrammingError, ER.DB_CREATE_EXISTS, ER.SYNTAX_ERROR, 
     ER.PARSE_ERROR, ER.NO_SUCH_TABLE, ER.WRONG_DB_NAME, 
     ER.WRONG_TABLE_NAME, ER.FIELD_SPECIFIED_TWICE, 
     ER.INVALID_GROUP_FUNC_USE, ER.UNSUPPORTED_EXTENSION, 
     ER.TABLE_MUST_HAVE_COLUMNS, ER.CANT_DO_THIS_DURING_AN_TRANSACTION) 
_map_error(DataError, ER.WARN_DATA_TRUNCATED, ER.WARN_NULL_TO_NOTNULL, 
     ER.WARN_DATA_OUT_OF_RANGE, ER.NO_DEFAULT, ER.PRIMARY_CANT_HAVE_NULL, 
     ER.DATA_TOO_LONG, ER.DATETIME_FUNCTION_OVERFLOW) 
_map_error(IntegrityError, ER.DUP_ENTRY, ER.NO_REFERENCED_ROW, 
     ER.NO_REFERENCED_ROW_2, ER.ROW_IS_REFERENCED, ER.ROW_IS_REFERENCED_2, 
     ER.CANNOT_ADD_FOREIGN, ER.BAD_NULL_ERROR) 
_map_error(NotSupportedError, ER.WARNING_NOT_COMPLETE_ROLLBACK, 
     ER.NOT_SUPPORTED_YET, ER.FEATURE_DISABLED, ER.UNKNOWN_STORAGE_ENGINE) 
_map_error(OperationalError, ER.DBACCESS_DENIED_ERROR, ER.ACCESS_DENIED_ERROR, 
     ER.CON_COUNT_ERROR, ER.TABLEACCESS_DENIED_ERROR, 
     ER.COLUMNACCESS_DENIED_ERROR) 

我想專門捕獲ER.DUP_ENTRY但我只知道如何捕捉IntegrityError並導致了我的異常俘獲中的冗餘情況。

cur.execute(query, values) 
except IntegrityError as e: 
    if e and e[0] == PYMYSQL_DUPLICATE_ERROR: 
      handel_duplicate_pymysql_exception(e, func_a) 
    else: 
      handel_unknown_pymysql_exception(e, func_b) 
except Exception as e: 
    handel_unknown_pymysql_exception(e, func_b) 

有沒有辦法簡單地只捕獲ER.DUP_ENTRY一些如何? 尋找類似:提前爲您指導

except IntegrityError.DUP_ENTRY as e: 
    handel_duplicate_pymysql_exception(e, func_a) 

感謝,

回答

3

基於異常情況下你不能指定一個想到條款明顯的屬性,甚至不是一個異常類屬性FWIW - 它只適用於異常類型。

一個解決問題的方法是有兩個嵌套的try/except塊,內一個處理重複條目,並重新提出其他IntegrityError S,外一個是通用的情況:

try: 
    try: 
     cur.execute(query, values) 
    except IntegrityError as e: 
     if e.args[0] == PYMYSQL_DUPLICATE_ERROR: 
      handle_duplicate_pymysql_exception(e, func_a) 
     else: 
      raise 

except Exception as e: 
    handle_unknown_pymysql_exception(e, func_b) 

這是否比重複呼叫handle_unknown_pymysql_exception取決於你...