2016-12-27 5 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/за исключением блоков, внутренняя одна обработки повторяющихся записей и повторное привлечение других IntegrityError с, внешним из которых является общим случаем:

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 зависит от вас ...

Смежные вопросы