Python: обработка исключений ODBC - PullRequest
0 голосов
/ 09 мая 2009

Мне нужно распознать в моем приложении, существует ли таблица или нет строк для выполнения соответствующих действий. Могу ли я поймать эти две ошибки отдельно?

>>>cursor.execute("delete from TABLE")

Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
dbi.internal-error: [IBM][CLI Driver][DB2] SQL0100W  No row was found for FETCH, UPDATE or DELETE; or the result of a query is an empty table.  SQLSTATE=02000
 in EXEC

OR

Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
dbi.program-error: [IBM][CLI Driver][DB2] SQL0204N  "SK77531.TCS_EXCEPTIONS" is an undefined name.  SQLSTATE=42704
 in EXEC

1 Ответ

1 голос
/ 09 мая 2009

Из документации Python :

Оператор try может содержать несколько единиц, кроме условия, для указания обработчиков для различных исключений.

Например:

try:
    do_something_crazy
except AttributeError:
    print 'there was an AttributeError'
except NameError:
    print 'there was a NameError'
except:
print 'something else failed miserably'

Последнее, кроме как действует здесь как ловушка, и выполняется только в том случае, если возникает исключение, отличное от AttributeError или NameError. В производственном коде лучше держаться подальше от такого универсального за исключением предложений, потому что, как правило, вы хотите, чтобы ваш код отказывал всякий раз, когда возникает ошибка, которую вы не ожидали.

В вашем конкретном случае вам нужно будет импортировать различные исключения, которые могут быть вызваны из модуля dbi, чтобы вы могли проверять их в других, кроме случаев.

Так что-то вроде этого:

# No idea if this is the right import, but they should be somewhere in that module
import dbi

try:
    cursor.execute("delete from TABLE")
except dbi.internal-error:
    print 'internal-error'
except dbi.program-error:
    print 'program-error'

Как вы увидите на вышеупомянутой странице документации, вы можете включить дополнительные атрибуты в каждое предложение кроме. Это позволит вам получить доступ к фактическому объекту ошибки, который может понадобиться вам в какой-то момент, когда вам необходимо различать два разных исключения одного и того же класса. Даже если вам не нужен такой высокий уровень разграничения, все же будет хорошей идеей сделать немного больше проверок, чем я описал выше, чтобы убедиться, что вы действительно имеете дело с ошибкой, с которой, по вашему мнению, вы сталкиваетесь.

Все, что сказано и сделано в отношении try / кроме того, что я действительно рекомендую, - это поиск метода в коде библиотеки базы данных, который вы используете, чтобы проверить, существует ли таблица или нет, прежде чем пытаться с ней взаимодействовать. Структурированные попытки / исключения очень полезны, когда вы имеете дело с внешним вводом, который необходимо проверить и санировать, но защитное кодирование вокруг предполагаемого существования таблицы базы данных звучит как нечто, что собирается повернуть вас назад и укусить позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...