2016-10-27 1 views
1

У меня есть блок try:finally, который должен выполняться всегда (исключение или нет), если не возникает конкретное исключение. Ради аргумента, скажем, это ValueError, поэтому я прошу, если я могу реализовать:Всегда выполняйте блок finally, за исключением одного исключения

try: 
    stuff() 
except Exception as e: 
    if type(e) is ValueError: raise 
    #do important stuff 
    raise 

#do important stuff 

в более элегантной моды, чтобы пропустить копировать-наклеивать #importantstuff. Если бы я управлял Python это будет выглядеть примерно так:

try: 
    stuff() 
finally except ValueError: 
    #do important stuff 

Ввод #importantstuff в функции не ответ, но не возможно есть.

+2

Нет, нет никакого способа сделать это. 'finally' - это вещи, которые должны всегда происходить. Почему бы не извлечь «важный материал» методу, который вы можете вызвать в обоих местах? Что означает «не ответ, но не возможно», значит? – jonrsharpe

+0

_ "try: finally block, который должен выполняться всегда (** исключение или нет **)" _ - Похоже, вы не хотите попробовать, кроме – IanAuld

ответ

3

Если вам нужно finally пропустить вещи в определенных условиях, вам нужно использовать явный флаг:

do_final_stuff = True 
try: 
    # ... 
except ValueError: 
    do_final_stuff = False 
    raise 
finally: 
    if do_final_stuff: 
     # ... 

Вы также можете использовать менеджер контекста здесь, чтобы очистить потом. Менеджер контекста передается текущее активное исключение, если оно есть:

class MyContextManager: 
    def __enter__(self): 
     return self 

    def __exit__(self, exc_type, exc_value, tb): 
     if exc_type is not ValueError: 
      # do cleanup 

with MyContextManager(): 
    # ... 
+0

Контекстно-ориентированная идея – jonrsharpe

+0

Оба более элегантные, хорошие идеи, спасибо , – kabanus

Смежные вопросы