Python - Использование "except" после "try" как части "else" для слова "try" - PullRequest
1 голос
/ 05 мая 2020

Я пытаюсь понять (и не могу найти окончательного ответа), считается ли хорошей практикой использовать часть «except» в try-except, как своего рода часть «else».

РЕДАКТИРОВАТЬ - чтобы попытаться быть более ясным:

Допустим, у меня есть 2 переменные для тестирования, и мне "нужна" только одна из них в качестве ответа (например, if-else). Каждый из них вызовет исключение в случае неудачи. Я попробовал первый, но ничего не вышло. Является ли хорошей практикой использовать раздел «кроме», чтобы продолжить код со второй переменной и установить ее как выбранную, или я должен использовать только часть «кроме» для обработки исключения, а затем выполнить какой-либо другой код (вне область "кроме"), чтобы также проверить вторую?


Оригинал:

То есть - для записи некоторого кода в except, который больше, чем просто маленький, кроме handle или print. Больше похоже на блок из нескольких строк кода, который может произойти только в том случае, если будет выбрано исключение, аналогично оператору else. То есть, в отличие от использования except только как части для конкретной обработки сгенерированного исключения и его последствий.

Пример -

try: perform-this-thing...

     perform-some-code

except:
     exception-raised-so-do-this-code...
     code
     code
     code

Если это не считается хорошей практикой - что такое Более правильный способ делать то, что я ищу?

Всем спасибо.

Ответы [ 3 ]

0 голосов
/ 05 мая 2020

Я бы предпочел использовать следующий подход для предотвращения ада отступов :

# create an auxiliary function to choose the valid variable
def choose_variable(*vars):
    default_value = -1 # you can change it or remove it if you the default return value is None
    for v in vars:
        try:
            # check your var here
            return v
        except:
            continue
    return default_value

, а затем использовать его в вашем коде:

chosen_value = choose_variable(v1,v2,v3)
print(f"The chosen value is {chosen_value}")
0 голосов
/ 05 мая 2020

На мой взгляд, эти две формы использования блока try-except абсолютно одинаковы, если вариант использования очень прост. Примерно так:

try:

    var1 = var + 1
    print(var1)

except:

    print(var)

    try:

        var1 = var + float(1)
        print(var1)

    except:

        print(var)

print('\n')

Эта версия эквивалентна первой версии блока try-except

try:
    var1 = var + 1
    print(var1)

except:

    print(var)


try:

    var1 = var + float(1)
    print(var1)

except:

    print(var)

print('\n')

Но в зависимости от эффекта, которого вы пытаетесь достичь, код может выглядеть по-разному и давать разные результаты. Примерно так:

try:
    var1 = var + '1'
    print(var1)

except:

    print(var)


try:

    var1 = var + float(1)
    print(var1)

except:

    print(var)

print('\n')

Эта третья версия будет иметь другой результат, чем вторая версия.

Другой способ написания кода - это упрощенный.


try:
    var1 = var + '1'
    print(var1)

except:

    try:

        var1 = var + float(1)
        print(var1)

    except:

        print(var)

И эта версия не совпадает с первой версией блока try-except.

При выполнении кода будут другие результаты.

15
15


15
15


151
15


151

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

0 голосов
/ 05 мая 2020

Обработка исключений - это процесс реагирования на ошибки программирования, которые нарушают нормальный поток выполнения программы. Акцент здесь должен быть сделан на « нарушить нормальный поток ».

Используйте обработчик исключений для восстановления после такой ошибки программирования, но не маскируйте реальные ошибки программирования. Особенно будьте осторожны с обработчиком исключений с подстановочными знаками и используйте его с особой осторожностью. в операторе if - else, поскольку это ваш обычный поток.

Если вы можете выполнить этот тест только с тестом на исключение, я бы сказал, что вы можете обернуть тесты отдельных переменных в try - except и, если это неизбежно, используйте вложенную обработку исключений, но я бы посоветовал не обрабатывать вложенные исключения, поскольку это делает код уродливым и неподдерживаемым (вложенные здесь будут тестировать для второй переменной в except первой) .

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

try:
    # Try to obtain variable 1
except ErrorObtainingVariable1
    # Log...
try:
    # Try to obtain variable 2
except ErrorObtainingVariable2
    # Log...
# Check to use variable 1 or 2
# If none set raise exception

(PS: также есть необязательная часть else из try - except, который следует за всеми пунктами за исключением и выполняется, если исключение не возникает. Вы можете использовать это, чтобы избежать получения второй переменной при получении первая переменная была успешной. См. в Python документации для получения дополнительной информации.)

...