Приложение условия Else в обработке исключений Python - PullRequest
2 голосов
/ 09 июня 2019

Для обработки исключений в python мы используем этот шаблон:

try:
   # do something
except NameError:
   # Do something for NameError exceptions
except:
   # Do something for other exceptions
   raise
else: 
   # Do something when didn't exist any exception
finally: 
   # Do something whether an exception has occurred or not
#rest of codes

Мой вопрос:

В чем разница между # do something for else и # rest of codes? Какой из них предпочтительнее другого и более принципиален?

Ответы [ 4 ]

2 голосов
/ 09 июня 2019

Блок else будет выполнен перед блоком finally, блок "остаток кода" будет выполнен после блока finally.

Если у вас нет блока finally, то на самом деле нет никакой разницы, и я подозреваю, что полное удаление блока else приведет к более чистому и читаемому коду.

1 голос
/ 09 июня 2019

Я попытался продемонстрировать на примере, поэтому я немного отредактировал ваш код, чтобы сосредоточиться только на соответствующих частях.

lst = [123, 512, 251]
for i in range(6):
    try:
       print(lst[i])
    except IndexError:
       print(f"Index {i} not there")
    else: 
       print("HELLO")
    finally:
       pass
    print("WORLD")

Это был вывод:

123
HELLO
WORLD
512
HELLO
WORLD
251
HELLO
WORLD
Index 3 not there
WORLD
Index 4 not there
WORLD
Index 5 not there
WORLD

Итак, как выможно видеть, что когда код в блоке try выполняется успешно, код в блоке else также выполняется.Но код #rest of the codes запускается независимо.

0 голосов
/ 09 июня 2019

Благодаря помощи, которую я взял от seysen в реализации простого примера моего кода, и хорошего замечания, которое было в комментариях sanyash , этот ответ пришел мне в головуи я думаю:

Это сильно зависит от обработки исключений.

Другими словами, поведение else и поведение#rest of codes полностью зависит от того, как обрабатывались исключения.

Рассмотрим следующие условия:

1. `try` run successfully:
 1.1 `else` will be executed. 
 1.2  `#rest of codes` will be executed.
2. Exception exist in `try` : 
    2.1 If we have `except: ... raise` or do not have a any handler:
        2.1.1  Built-in exception or `except: ... raise` will be executed. 
        2.1.2  Because we have exception: `else` will not be executed.
        2.1.3  Because the program stops: `#rest of codes` will not be executed.
    2.2 If there is an exception handler and program goes exactly inside of this handler: 
        2.2.1  Because we have exception: `else` will not be executed.  
        2.2.2 `#rest of codes` will be executed.

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

0 голосов
/ 09 июня 2019

# do something for else сделает что-то, только если нет исключения.

Пока # rest of codes будет делать что-то всегда.В противном случае это порядок операций.

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