Для чего предназначено необязательное else
предложение try
оператора?
python
exception-handling
geowa4
источник
источник
Ответы:
Операторы в
else
блоке выполняются, если выполнение падает в нижней частиtry
- если не было исключений. Честно говоря, я никогда не нашел в этом необходимости.Тем не менее, примечания по обработке исключений :
Итак, если у вас есть метод, который может, например, выдать
IOError
, и вы хотите перехватывать исключения, которые он вызывает, но есть еще кое-что, что вы хотите сделать, если первая операция завершится успешно, и вы не хотите перехватывать IOError эта операция, вы можете написать что-то вроде этого:Если вы просто поставите
another_operation_that_can_throw_ioerror()
послеoperation_that_can_throw_ioerror
, тоexcept
будет ловить ошибки второго вызова. И если вы поставите его после целогоtry
блока, он всегда будет запущен, и только послеfinally
.else
Позволяет убедиться ,finally
блоком, иIOError
s, которые это поднимает, не пойманы здесьисточник
return
,continue
илиbreak
.Есть одна большая причина для использования
else
- стиль и удобочитаемость. Как правило, рекомендуется хранить код, который может вызывать исключения, рядом с кодом, который их обрабатывает. Например, сравните это:а также
Второй вариант хорош, когда
except
нельзя вернуться рано или повторно выдать исключение. Если возможно, я бы написал:Примечание: Ответ скопирован с недавно отправленный дубликат здесь , следовательно , все эти вещи «AskPassword».
источник
Одно использование: протестировать некоторый код, который должен вызвать исключение.
(Этот код должен быть абстрагирован в более общий тест на практике.)
источник
Предполагаемое использование состоит в том, чтобы иметь контекст для запуска большего количества кода, если не было исключений, где он должен был быть обработан.
Этот контекст позволяет избежать случайной обработки ошибок, которые вы не ожидали.
Но важно понять точные условия , которые вызывают еще пункт о перспективе, потому что
return
,continue
иbreak
может прервать поток управления вelse
.В итоге
else
Заявление работает , если нет ни одного исключения , и если не прерываетсяreturn
,continue
илиbreak
заявление.Другие ответы пропускают эту последнюю часть.
Из документов:
(Добавлен жирный шрифт.) И сноска гласит:
Требуется хотя бы одно предшествующее, кроме предложения ( см. Грамматику ). Так что на самом деле это не «попробуй-иначе», это «попробуй-кроме-еще (-наконец)», с
else
(иfinally
) является необязательным.В Python Tutorial конкретизирует предполагаемого использования:
Пример дифференцирования
else
и кода послеtry
блокаЕсли вы обработаете ошибку,
else
блок не будет работать. Например:И сейчас,
источник
Try-кроме-еще отлично подходит для объединения шаблона EAFP с Duck-Typing :
Вы могли бы подумать, что этот наивный код подходит:
Это отличный способ случайно скрыть серьезные ошибки в вашем коде. Я опечатал там уборку, но ошибка AttributeError, которая дала бы мне знать, проглатывается. Хуже того, что если бы я написал это правильно, но метод очистки иногда передавал пользовательский тип, имеющий атрибут с неправильным именем, что приводило к молчаливому сбою на полпути и оставлению файла незамеченным? Удачи в отладке этого.
источник
Я считаю, что это действительно полезно, когда нужно выполнить очистку, даже если есть исключение:
источник
Даже если вы не можете думать об использовании этого прямо сейчас, вы можете поспорить, что должно быть использование для этого. Вот невообразимый образец:
С
else
:Без
else
:Здесь у вас есть переменная,
something
определенная, если нет ошибки. Вы можете удалить это внеtry
блока, но тогда это требует некоторого беспорядочного обнаружения, если переменная определена.источник
something = a[2]; print something
внутри блока try: block?Там хороший пример
try-else
в PEP 380 . По сути, все сводится к разной обработке исключений в разных частях алгоритма.Это что-то вроде этого:
Это позволяет вам писать код обработки исключений ближе к месту возникновения исключения.
источник
Из ошибок и исключений # Обработка исключений - docs.python.org
источник
Глядя на ссылку Python, кажется, что
else
выполняется после того,try
как нет исключений. Необязательное условие else выполняется, если и когда управление выходит из конца предложения try. 2 Исключения в предложении else не обрабатываются предыдущим, за исключением предложений.У погружения в python есть пример, где, если я правильно понимаю, в
try
блоке они пытаются импортировать модуль, когда это не удается, вы получаете исключение и связываете значение по умолчанию, но когда это работает, у вас есть возможность перейти вelse
блок и связать то, что требуется (см. ссылка на пример и пояснения).Если вы попытаетесь выполнить работу в
catch
блоке, это может вызвать еще одно исключение - я думаю, именно здесьelse
блок пригодится.источник
try
блока.Вот и все. Блок «else» предложения try-exc существует для кода, который выполняется, когда (и только когда) успешная операция выполняется. Его можно использовать и злоупотреблять.
Лично мне это нравится, и я использую его, когда это уместно. Семантически группирует утверждения.
источник
Возможно использование может быть:
Может быть, это приведет вас к пользе.
источник
Я нашел эту
try: ... else:
конструкцию полезной в ситуации, когда вы выполняете запросы к базе данных и записываете результаты этих запросов в отдельную базу данных того же типа / типа. Допустим, у меня много рабочих потоков, все они обрабатывают запросы к базе данных, отправленные в очередьКонечно, если вы можете различить возможные исключения, которые могут быть выброшены, вам не обязательно использовать это, но если код, реагирующий на успешный фрагмент кода, может выдать то же исключение, что и успешный фрагмент, и вы не можете просто отпустите второе возможное исключение или сразу же вернитесь в случае успеха (в моем случае это приведет к прерыванию потока), тогда это пригодится.
источник
else
Блок часто может существовать в дополнение к функциональности , которая происходит в каждомexcept
блоке.В этом случае
inconsistency_type
устанавливается в каждом блоке кроме, так что поведение дополняется в случае отсутствия ошибок вelse
.Конечно, я описываю это как шаблон, который может когда-нибудь появиться в вашем собственном коде. В этом конкретном случае вы просто устанавливаете
inconsistency_type
0 передtry
блоком в любом случае.источник
Вот еще одно место, где мне нравится использовать этот шаблон:
источник
continue
взамен - паттерн «пробейся раньше». Это позволяет вам отказаться от предложения else и отступа, что делает код более легким для чтения.Один из сценариев использования, о котором я могу подумать, - это непредсказуемые исключения, которые можно обойти, если вы попытаетесь снова. Например, когда операции в блоке try содержат случайные числа:
Но если исключение может быть спрогнозировано, вы всегда должны заранее выбирать проверку вместо исключения. Однако не все может быть предсказано, поэтому этот шаблон кода имеет свое место.
источник
break
внутреннюю частьtry
в конце, что чище ИМО, и вам не нужноelse
. Кроме того,continue
это действительно не нужно, вы можете простоpass
.Я нашел
else
полезным для работы с возможно неправильным файлом конфигурации:Исключение при чтении
lock
конфигурации отключает мониторинг блокировки, а ValueErrors записывает полезное предупреждающее сообщение.источник
Предположим, что ваша логика программирования зависит от того, есть ли в словаре запись с заданным ключом. Вы можете проверить результат
dict.get(key)
использованияif... else...
конструкции, или вы можете сделать:источник
Я бы добавил еще один вариант использования, который кажется простым при обработке сессий БД:
источник
else:
Блок сбивает с толку , и (почти) бесполезно. Это также является частьюfor
иwhile
отчетности.На самом деле, даже в
if
заявленииelse:
можно по-настоящему ужасно злоупотреблять, создавая ошибки, которые очень трудно найти.Учти это.
Подумай дважды
else:
. Это вообще проблема. Избегайте его, за исключением случаев, вif
-statement и даже тогда подумайте о документированииelse
условия -, чтобы сделать его явным.источник
if x > 0: return "yes"
аif x <= 0: return "no"
. Теперь человек приходит и меняет одно из условий, чтобы сказать,x > 1
но забывает изменить другое. Как это уменьшить количество ошибок, которые будут зафиксированы.if else
пункты иногда много разделены. СУХОЙ это хорошая практика, гораздо чаще, чем нет, правда. (Извините за двойной пост).