2015-07-01 8 views
0

У меня есть требование выполнить несколько инструкций Python, и некоторые из них могут завершиться неудачно во время выполнения, даже после сбоя, я хочу, чтобы остальные из них были выполнены.Лучший способ использовать try за исключением блока

В настоящее время я делаю:

try: 
    wx.StaticBox.Destroy() 
    wx.CheckBox.Disable() 
    wx.RadioButton.Enable() 
except: 
    pass 

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

Как это сделать в Python?

+2

Как он может запускать все 3, если какой-либо из них не может работать, потому что он не прошел? –

+3

1. Не используйте голые 'except', *, по крайней мере, * используйте' except Exception'. 2. Если эти утверждения должны быть выполнены (или нет) независимо, ** поместите их в отдельные блоки 'try'! ** – jonrsharpe

+0

@TimCastelijns Я предполагаю, что он означает, что все они должны быть предприняты. – Sam

ответ

4

Если в блоке try возникает исключение, остальная часть блока пропускается. Вы должны использовать три отдельных предложения try для трех разных операторов.

Добавлено в ответ на комментарий:

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

def mytry(functionname): 
    try: 
     functionname() 
    except Exception: 
     pass 

Затем вызывается метод с именем вашего функция в качестве входных данных:

mytry(wx.StaticBox.Destroy) 
+0

Я только что привел пример как 3 заявления. В реальном времени у меня более 12 заявлений. 12 попытка, кроме блока в программе, выглядела бы неплохо. – Arunkumar

+0

@Arunkumar В этом случае используйте метод обертки. См. Мое редактирование, которое я сделаю через секунду. – Sam

+0

@ Arunkumar, тогда вам нужно * «более 12" * блоков или рефакторинг в цикле. Вы можете использовать ['contextlib.suppress'] (https://docs.python.org/3/library/contextlib.html#contextlib.suppress), чтобы очистить код, если вы используете Python 3.4. – jonrsharpe

6

Используйте for петлю над методами вы хотите позвонить, например:

for f in (wx.StaticBox.Destroy, wx.CheckBox.Disable, wx.RadioButton.Enable): 
    try: 
     f() 
    except Exception: 
     pass 

Обратите внимание, что здесь мы используем except Exception - это, как правило, гораздо более вероятно, чем вы хотите, чем голый, кроме.

-1

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

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

import sys 
class catch_exception: 
    def __init__(self, raising=True): 
     self.raising = raising 

    def __enter__(self): 
     pass 

    def __exit__(self, type, value, traceback): 
     if issubclass(type, Exception): 
      self.raising = False 

     print ("Type: ", type, " Log me to error log file") 
     return not self.raising 



def staticBox_destroy(): 
    print("staticBox_destroy") 
    raise TypeError("Passing through") 

def checkbox_disable(): 
    print("checkbox_disable") 
    raise ValueError("Passing through") 

def radioButton_enable(): 
    print("radioButton_enable") 
    raise ValueError("Passing through") 


if __name__ == "__main__": 
    with catch_exception() as cm: 
     staticBox_destroy() 
    with catch_exception() as cm: 
     checkbox_disable() 
    with catch_exception() as cm: 
     radioButton_enable() 
+0

Oh ... ** wow **. Пожалуйста, немедленно прочитайте http://stackoverflow.com/editing-help, я даже не прикасаюсь к этому. – jonrsharpe

+0

Я исправил форматирование. Извините, используя стек в первый раз. Спасибо за ссылку. – qkhan

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