Продолжайте в предложении try в Python, даже если возникло исключение - PullRequest
0 голосов
/ 25 января 2019

Есть ли способ продолжить выполнение кода в предложении try, даже если возникло исключение?

Это пример кода.

outer_margin = 0.125  # Default Amazon
safe_zone = 0.25  # Default Amazon
safe_spine = 0.0625  # Default Amazon
if custom_measure is not None:
    if isinstance(custom_measure, dict):
        try:
            outer_margin = custom_measure["outer_margin"]
            safe_zone = custom_measure["safe_zone"]
            safe_spine = custom_measure["safe_spine"]
        except KeyError as e:
            logger.warning("Key {} not found, default value used.".format(e))

Все три значения являются необязательными, поэтому ключ outer_margin может не существовать, но может присутствовать safe_zone. Я хотел бы достичь safe_zone, даже если вызов outer_margin вызывает исключение. Есть ли способ сделать это в одном блоке try / Кроме? Что-то вроде:

# Not valid syntax
try:
    outer_margin = custom_measure["outer_margin"]
try:
    safe_zone = custom_measure["safe_zone"]
except KeyError as e:
    pass

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

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Если вам действительно нужен журнал, выполните рефакторинг try/except оттуда:

def get_with_warning(data, key, default):
    if key in data:
        return data[key]
    else:
        logger.warning("Key {} not found, default value used.".format(key))
        return default

outer_margin = get_with_warning(custom_measure, "outer_margin", 0.125)
safe_zone = get_with_warning(custom_measure, "safe_zone", 0.25)
safe_spine = get_with_warning(custom_measure, "safe_spine", 0.0625)

Если нет, то это так просто:

outer_margin = custom_measure.get("outer_margin", 0.125)
safe_zone = custom_measure.get("safe_zone", 0.25)
safe_spine = custom_measure.get("safe_spine", 0.0625)
0 голосов
/ 25 января 2019

Вы можете использовать dict.get вместо перехвата исключения KeyError.

if isinstance(custom_measure, dict):
    outer_margin = custom_measure.get("outer_margin")
    safe_zone = custom_measure.get("safe_zone")
    safe_spine = custom_measure.get("safe_spine")

если "outer_margin" не существует в custom_measure, оно будет установлено на None.

Вы также можете установить другое значение по умолчанию, отличное от None, например:

outer_margin = custom_measure.get("outer_margin", 0)
...