Как сделать ошибку, но продолжить скрипт на python? - PullRequest
2 голосов
/ 06 октября 2009

Предположим, у меня есть этот код на Python:

l = dict['link']
t = dict['title']        <<<<<<<<error here, there is no "title"
d = dict['description']
k = dict['keyword']

Что если в строке 2 произошла ошибка, но я хочу, чтобы он продолжил выполнение сценария и назначил другие значения? Можно ли просто «игнорировать» ошибки?

РЕДАКТИРОВАТЬ: я знаю, как сделать простую попытку, кроме. Тем не менее, часто, когда в # 2 возникает ошибка, он выдает исключение, а затем НЕ продолжает остальную часть кода.

РЕДАКТИРОВАТЬ: я понимаю, что есть метод "получить". Однако я бы хотел ОБЩИЙ способ сделать это ... Я не всегда буду использовать словари.

Ответы [ 7 ]

12 голосов
/ 06 октября 2009

Самый простой вариант - использовать .get():

l = dict.get('link')
t = dict.get('title')
d = dict.get('description')
k = dict.get('keyword')

Переменная t будет содержать None (например, вы можете использовать dict.get('title', ''), если вы хотите пустую строку) Другой вариант - перехватить исключение KeyError.

8 голосов
/ 06 октября 2009
t = dic.get('title')

не выдаст ошибку. это эквивалентно:

try:
    t = dic['title']
except KeyError:
    t = None

и, пожалуйста, не затеняйте встроенное, не используйте dict для имени переменной. использовать что-то еще.

3 голосов
/ 06 октября 2009

Если вам нужен способ использовать исключения и продолжить (хотя это, вероятно, не очень хорошая идея), вы можете использовать функцию-обертку, например:

def consume_exception(func, args, exception):
    try:
        return func(*args)
    except exception:
        return None

Или что-то в этом роде.

Тогда звоните

l = consume_exception(dict.__getitem__, ['link'], KeyError)
t = consume_exception(dict.__getitem__, ['title'], KeyError)
...
1 голос
/ 06 октября 2009

В этом случае лучше всего использовать

l = dict.get('link', 'default')
t = dict.get('title', 'default')

и т.д.

Любые значения, которых нет в словаре, будут установлены на 'default' (или что вы выберете). Конечно, вам придется иметь дело с этим позже ...

0 голосов
/ 06 октября 2009

Использовать исключения

try:
    l = dict['link']
    t = dict['title']  
    d = dict['description']
    k = dict['keyword']
except (RuntimeError, TypeError, NameError):
    print ('something')
0 голосов
/ 06 октября 2009

Try / за исключением / наконец; см. учебник

Однако главный вопрос таков; почему вы в первую очередь назначаете их переменным вместо доступа к словарю?

0 голосов
/ 06 октября 2009

Вы когда-нибудь слышали о Try Catch и обработке исключений? Вы можете прочитать о них здесь

Тем не менее, вам следует избегать преднамеренных ошибок, почему у вас есть код, который, как вы знаете, потерпит неудачу?

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