WedX - журнал о программировании и компьютерных науках

когда необходимо добавить предложение else к try..except в Python?

Когда я пишу код на Python с обработкой исключений, я могу написать такой код:

try:
    some_code_that_can_cause_an_exception()
except:
    some_code_to_handle_exceptions()
else:
    code_that_needs_to_run_when_there_are_no_exceptions()

Чем это отличается от:

try:
    some_code_that_can_cause_an_exception()
except:
    some_code_to_handle_exceptions()

code_that_needs_to_run_when_there_are_no_exceptions()

В обоих случаях code_that_needs_to_run_when_there_are_no_exceptions() будет выполняться при отсутствии исключений. Какая разница?

22.08.2009

Ответы:


1

Фактически, во втором фрагменте всегда выполняется последняя строка.

Вы, наверное, имели в виду

try:
    some_code_that_can_cause_an_exception()
    code_that_needs_to_run_when_there_are_no_exceptions()
except:
    some_code_to_handle_exceptions()

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

22.08.2009
  • Да, второй фрагмент всегда выполняется, но между первым фрагментом и вашим образцом есть нечто большее, чем различие в удобочитаемости / стилистике. В первом фрагменте code_that_needs_to_run_where_there_are_no_exceptions () никогда не может вызвать выполнение some_code_to_handle_exceptions (), тогда как в вашем фрагменте это возможно. 22.08.2009
  • Дэвид, ты прав. Как видите, я понял это примерно за 30 секунд до того, как вы разместили свой комментарий :) 22.08.2009

  • 2

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

    so ...

    В обоих случаях code_that_needs_to_run_when_there_are_no_exceptions () будет выполняться, когда нет исключений, но в последнем случае будет выполняться, когда исключения есть и не являются.

    Попробуйте это на своем CLI

    #!/usr/bin/python
    
    def throws_ex( raise_it=True ):
            if raise_it:
                    raise Exception("Handle me")
    
    def do_more():
            print "doing more\n"
    
    if __name__ == "__main__":
            print "Example 1\n"
            try:
                    throws_ex()
            except Exception, e:
                    # Handle it
                    print "Handling Exception\n"
            else:
                    print "No Exceptions\n"
                    do_more()
    
            print "example 2\n"
            try:
                    throws_ex()
            except Exception, e:
                    print "Handling Exception\n"
            do_more()
    
            print "example 3\n"
            try:
                    throws_ex(False)
            except Exception, e:
                    print "Handling Exception\n"
            else:
                    do_more()
    
            print "example 4\n"
            try:
                    throws_ex(False)
            except Exception, e:
                    print "Handling Exception\n"
            do_more()
    

    Он выведет

    Пример 1

    Обработка исключения

    пример 2

    Обработка исключения

    делать больше

    пример 3

    делать больше

    пример 4

    делать больше

    Вы поняли, поиграйте с исключениями, всплыванием и другими вещами! Взломайте командную строку и VIM!

    22.08.2009

    3

    Пример 1:

    try:
        a()
        b()
    except:
        c()
    

    Здесь b() будет запущен только в том случае, если a() не сгенерировал, но блок except также перехватит любые исключения, которые могут быть сгенерированы b(), которые могут вам не понадобиться. Общее правило: перехватывайте только те исключения, которые, как вы знаете, могут произойти (и у которых есть способ обработки). Поэтому, если вы не знаете, вызовет ли b(), или если вы не можете сделать ничего полезного, перехватывая исключение, созданное b(), тогда не помещайте b() в блок try:.

    Пример 2:

    try:
        a()
    except:
        c()
    else:
        b()
    

    Здесь b() будет запущен только в том случае, если a() не сгенерировал, но любые исключения, которые бросает b(), здесь не будут перехвачены и будут продолжать распространяться вверх по стеку. Очень часто это именно то, что вам нужно.

    Пример 3:

    try:
        a()
    except:
        c()
    
    b()
    

    Здесь b() всегда выполняется, даже если a() ничего не бросил. Конечно, это тоже довольно часто бывает полезно.

    22.08.2009

    4

    У вас был почти правильный исходный код. Вот полное лечение:

    try:
        some_code_that_can_cause_an_exception()
    except:
        some_code_to_handle_exceptions()
    else:
        code_that_needs_to_run_when_there_are_no_exceptions()
    
    code_that_runs_whether_there_was_an_exception_or_not()
    
    22.08.2009
  • не должен code_that_runs_whether_there_was_an_exception_or_not() быть в блоке finally? 14.09.2009

  • 5

    Хотя ответ Неда Батчелдера подходит для ОП, я хотел бы немного развить его. Кроме того, я не могу ответить как комментарий к комментарию Mk12 (поскольку у меня "всего" 49 репутации, а не 50, поймите). Итак, мой вклад:

    try:
        code_that_can_cause_an_exception()
    except ParticularException:
        code_to_handle_the_particular_exception()
    except:
        code_to_handle_all_other_exceptions()
    else:
        code_to_run_when_there_are_no_exceptions_and_which_should_not_be_run_after_except_clauses()
    finally:
        code_to_run_whether_there_was_an_exception_or_not_even_if_the_program_will_exit_from_the_try_block()
    
    code_to_run_whether_there_was_an_exception_or_not_if_execution_reaches_here()
    
    22.03.2014

    6

    Согласно документам ...

    "Необязательное предложение else выполняется, если и когда управление переходит в конец предложения try. 7.2 Исключения в предложении else не обрабатываются предыдущими предложениями except."

    Так что посмотрите на этот базовый пример как на свой ответ

    try:
      print("Try with Exception")
      print(sys.path)
    except NameError:
      print "Exception"
    else:
      print "Else"
    
    print("Out of try/except block")
    
    try:
      print("Try without Exception")
    except NameError:
      print "Exception"
    else:
      print "Else is now executed"
    
    print("Out of try/except finally")
    

    Посмотрите, как выполнялось else, когда исключения не возникало.

    22.08.2009

    7

    Я использую try: .. except: .. else: много!

    Это шаблон: try..except должен охватывать только одну строку кода, в которой я ожидаю исключения. Затем, кроме того, выполняется резервная обработка / обработка по умолчанию, и else: выполняет то, что я действительно хотел сделать (без исключений => продолжайте делать то, что я хотел).

    Простой пример:

       # Exhibit 1
       data_paths = []
       try:
           from . import version_subst
       except ImportError:
           first_datadir = "./data"
       else:
           first_datadir = os.path.join(version_subst.DATADIR, PACKAGE_NAME)
    
    
    # Exhibit 2
    for attr in attrs:
        try:
            obj = getattr(plugin, attr)
        except AttributeError, e:
            if warn:
                pretty.print_info(__name__, "Plugin %s: %s" % (plugin_name, e))
            yield None
        else:
            yield obj
    
    23.08.2009

    8

    Я не использую Python так долго, но я пытаюсь обрабатывать определенные исключения в блоке try и использую else для обработки «других» исключений, которых я, возможно, не ожидал, аналогично блоку default в C / C ++ switch блоки. Это подходящее использование и для else?

    22.08.2009
  • Игнорируйте мой пост, это вообще не работает. Вернемся к книгам для меня! 25.08.2009
  • Новые материалы

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


    Для любых предложений по сайту: [email protected]