Проигнорируйте повышение исключения для вызывающей стороны в Python 3
Как я могу игнорировать определенное исключение, которое будет вызвано для вызывающей стороны в Python 3?
Пример:
def do_something():
try:
statement1
statement2
except Exception as e:
# ignore the exception
logging.warning("this is normal, exception is ignored")
try:
do_something()
except Exception as e:
# this is unexpected control flow, the first exception is already ignored !!
logging.error("unexpected error")
logging.error(e) # prints None
Я обнаружил, что кто-то упомянул, что "из-за последнего сгенерированного исключения, запоминаемого в Python, некоторые объекты, участвующие в операторе выбрасывания исключений, сохраняются в течение неопределенного времени", а затем упоминается об использовании "sys.exc_clear()" в этом случае, который больше не доступен в Python 3. Любая подсказка, как я могу полностью игнорировать исключение в Python3?
2 ответа
Там нет необходимости делать это в Python 3
, sys.exc_clear()
был удален, потому что Python не хранит последнее возникшее исключение внутри, как это было в Python 2:
Например, в Python 2 исключение все еще сохраняется, когда внутри функции:
def foo():
try:
raise ValueError()
except ValueError as e:
print(e)
import sys; print(sys.exc_info())
призвание foo
теперь показывает, что исключение сохраняется:
foo()
(<type 'exceptions.ValueError'>, ValueError(), <traceback object at 0x7f45c57fc560>)
Вам нужно позвонить sys.exc_clear()
для того, чтобы очистить Exception
поднял.
В Python 3 наоборот:
def foo():
try:
raise ValueError()
except ValueError as e:
print(e)
import sys; print(sys.exc_info())
Вызов той же функции:
foo()
(None, None, None)
просто изучаю исключения Python ... и я вижу, что этому вопросу 5 лет, но -
Я слышу ответ выше - «очищать не нужно», но я попробовал какой-то тестовый код, провел много исследований ... Этот код указывает на то, что исключение ValueError не очищается в этом цикле:
line = input () error = True, а ошибка:try:val = int(line.strip ()) print ("Получено значение int {}, спасибо!". format (val)) error = False, кроме ValueError: print ( f "Ваш ввод не содержит (всех) чисел (т.е. цифр) \n"); print ("Обнаружена ошибка:", sys.exc_info ()) except: print ("Обнаружена ошибка:", sys.exc_info ()) print ("Обнаружена ошибка, скорее всего, не 'int', exc_clear (), ... попробуйте еще раз: ") # PyErr_Clear () только для C API?# sys.exc_clear () не определен для Py 3.x, наконец: print ("Всегда делайте 'finally' ...")
Вводя нецифровые символы, я получаю циклический цикл из следующих строк:
«Ваш ввод не содержит (всех) чисел (т.е. цифр). Обнаружена ошибка: (<class 'ValueError'>, ValueError (« недопустимый литерал для int () с базой 10: 'uiogf' »), <объект трассировки в 0x7f1ddcb1c4c0>) Всегда делайте "наконец-то" ... "
Есть ли способ очистить здесь исключение и выполнить цикл до тех пор, пока пользователь не даст действительный ввод?
Или это просто нехороший способ?
теоретический вопрос, код, конечно, можно реорганизовать.