Python: вложенная попытка поймать обработку - PullRequest
0 голосов
/ 13 февраля 2019

в настоящее время у меня есть некоторый код, подобный этому

try:
    somecode
except Exception as Error:
    fallbackcode

Теперь я хочу добавить еще один запасной вариант к коду отката. Какова лучшая практика для создания вложенного try / catch в python?

try:
    somecode
except Exception as Error:
    try:
        fallbackcode
    except Exception as Error:
        nextfallbackcode

выдает целенаправленные ошибки

Ответы [ 4 ]

0 голосов
/ 13 февраля 2019

вы можете использовать функции для обработки ошибок:

def func0():
    try:
        somecode
    except:
        other_func()

def func1():
    try:
        somecode
    except:
        func0()
0 голосов
/ 13 февраля 2019

Вы можете переписать логику, используя цикл, при условии, что все ваши обратные вызовы и резервные копии имеют одинаковый интерфейс API

for code in [somecode, fallbackcode, nextfallbackcode]:
    try:
        code(*args, **kwargs)
        break
    except Exception as Error:
        continue
else:
    raise HardException

Это предпочтительный способ вместо нескольких уровней вложенных блоков исключений.

0 голосов
/ 13 февраля 2019

Вы могли бы изменить это так:

try:
    try:
        somecode
    except Exception as Error:
        fallbackcode
except Exception as Error:
    nextfallbackcode
0 голосов
/ 13 февраля 2019

Вы должны иметь возможность делать вложенные блоки try /, кроме случаев, точно так, как это реализовано в вашем вопросе.

Вот еще один пример:

import os

def touch_file(file_to_touch):
    """
    This method accepts a file path as a parameter and
    returns true/false if it successfully 'touched' the file
    :param '/path/to/file/'
    :return: True/False
    """    
    file_touched = True

    try:
        os.utime(file_to_touch, None)
    except EnvironmentError:
        try:
            open(file_to_touch, 'a').close()
        except EnvironmentError:
            file_touched = False

    return file_touched
...