когда необходимо добавить предложение "else" в try..except в Python? - PullRequest
4 голосов
/ 22 августа 2009

Когда я пишу код на 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() будет выполняться, когда нет исключений. Какая разница?

Ответы [ 8 ]

9 голосов
/ 22 августа 2009

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

так ...

В обоих случаях 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!

7 голосов
/ 22 августа 2009

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

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

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.

6 голосов
/ 22 августа 2009

Пример 1:

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

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

Пример 2:

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

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

Пример 3:

try:
    a()
except:
    c()

b()

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

4 голосов
/ 22 августа 2009

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

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()
2 голосов
/ 22 марта 2014

Хотя ответ Неда Батчелдера подходит для ОП, я бы хотел немного развить его. Кроме того, я не могу отвечать как комментарий к комментарию 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()
1 голос
/ 24 августа 2009

Я использую try: .. кроме: .. еще: много!

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

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

   # 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
1 голос
/ 22 августа 2009

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

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

Итак, посмотрите на этот базовый пример как на ваш ответ

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, когда исключение не произошло.

0 голосов
/ 22 августа 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...