Python: пока не исключение

Итак, я знаю, что вы можете использовать блоки try/except для управления выводом ошибок, например:

try:
    print("ok")
    print(str.translate)
    print(str.foo)
except AttributeError:
    print("oops, found an error")

print("done")

... что дает следующий результат:

ok
<method 'translate' of 'str' objects>
oops, found an error
done

Теперь есть способ сделать следующее с помощью цикла while, такого как while not AttributeError, например:

while not AttributeError:
    print("ok")
    print(str.translate)
    print(str.foo)
print("done")

что даст тот же результат, что и выше, только без oops, found an error? Это уменьшит потребность в блоках типа except: pass, которые необходимы, но немного бессмысленны, если вам нечего делать в блоке except.

Я пробовал while not AttributeError и while not AttributeError(), которые полностью пропускают что-либо в блоке while. Итак, есть ли способ сделать это в Python?

Редактировать: Это действительно не петля как таковой, но блок while будет запущен и продолжит работу, если обнаружит ошибку, и просто продолжит работу, если достигнет конца.

Вы должны видеть блоки try / except как «если все в порядке» / «еще». Python вызывает все ошибки, если вы хотите "пропустить" одну, except AttributeError: pass - это то, что вам нужно. Это не бессмысленно, вы прямо заявляете, что хотите пропустить эту ошибку (или применить другой процесс, или что-то еще). Обновлено: И нет while not AttributeError

Arount 29.12.2018 18:08

Если не возникнет исключение, будет ли он что-нибудь повторять?

Davis Herring 29.12.2018 18:10

@DavisHerring Нет, он будет запускать блок до конца, и он будет продолжать работать независимо от того, была ли ошибка или нет. Если произошла ошибка, она закончилась бы раньше и просто продолжила.

miike3459 29.12.2018 18:11

Это бесконечный цикл? Какое условие остановки? Он ломается при возникновении исключения?

cs95 29.12.2018 18:17

Это не то, как следует использовать исключения - используйте стандартную методологию try/except.

Adam 29.12.2018 18:18

Помимо того факта, что зацикливание whileнет ... удивительно, этот новый синтаксис сохранил бы только одна линияexcept AttributeError: pass!

Davis Herring 29.12.2018 18:42
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
7
6
9 480
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Вы можете попробовать что-нибудь вроде:

while True:
    try:
        print("ok")
        print(str.translate)
        print(str.foo)
    except:
        break
print('done')

Следующий код будет повторяться до тех пор, пока не обнаружит ошибку.

while True:
  try:
    print("ok")
    print(str.translate)
    print(str.foo)
  except AttributeError:
    print("oops, found an error")
    break
  print("done")

Вы можете использовать suppress() в качестве альтернативы try/except/pass, доступной для python 3.4+.

from contextlib import suppress

while True:
    with suppress(AttributeError):
        print("ok")
        print(str.translate)
        print(str.foo)
    break
print('done')

Вы можете вложить цикл while:

try:
    while True:
        print("ok")
        print(str.translate)
        print(str.foo)
except:
    pass
print('done')

Другие вопросы по теме