Избегайте вложенных try / except - PullRequest
1 голос
/ 06 августа 2020

У меня следующая структура кода:

try:
    x = function_one(args)
    try:
        y = function_two(args)
        try:
            #
            # some code where I need x and y
            #
        except Exception as e::
            print("Problem with code above : ", e)
    except Exception as e:
        print("Problem with function_two : ", e)
    #
    # some code here
    #
except Exception as e:
        print("Problem with function_one : ", e)

Он работает, но мне было интересно, могу ли я избежать этой вложенной попытки / исключения? Например, если x пуст и не может использоваться после, было бы лучше поместить try / except внутри function_one и найти решение, чтобы проверить, могу ли я использовать x для остальной части кода, а если нет, остановите код? Я мог бы сделать if x something, но он также создает вложенную часть.

Ответы [ 3 ]

2 голосов
/ 06 августа 2020

Если ваш блок исключения не выполняет что-то функциональное (продолжая выполнение остальной части кода, если в нем даже есть ошибка), вам не следует использовать вложенный блок try-catch. Вместо этого вы можете написать дополнительный блок исключений. Например,

try:
    x = function_one(args)
    
    y = function_two(args)
        
except Exceptionx as e:
        print("Problem with function_one : ", e)
except Exceptiony as e:
        print("Problem with function_two : ", e)

Exceptionx и Exceptiony должны быть объектом класса Exception, и вы должны знать, какое исключение вы получите. Вы можете узнать больше примеров на https://docs.python.org/3/tutorial/errors.html

2 голосов
/ 06 августа 2020

Если причина разных блоков except заключается в том, чтобы лучше понять, где произошла ошибка, вы можете просто заключить весь блок в один блок try-except и распечатать трассировку:

import traceback

try:
    x = function_one(args)
    y = function_two(args)
except:
    traceback.print_exc()
2 голосов
/ 06 августа 2020

Если вы проверяете только определенный блок кода с помощью try \ except, вы можете просто обернуть этот блок в обработчике:

try:
    x = function_one(args)
except Exception as e:
        print("Problem with function_one : ", e)   
         
try:
    y = function_two(args)
except Exception as e:
   print("Problem with function_two : ", e)
   
try:
    #
    # some code where I need x and y
    #
except Exception as e::
    print("Problem with code above : ", e)
    
try:
    #
    # some code here
    #
except Exception as e::
    print("Problem with code above : ", e)

В общем, вставляйте только блоки исключений, если вы планируете обрабатывать более конкретную ошибку c во внутреннем блоке.

...