Проигнорируйте повышение исключения для вызывающей стороны в 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>) Всегда делайте "наконец-то" ... "

Есть ли способ очистить здесь исключение и выполнить цикл до тех пор, пока пользователь не даст действительный ввод?

Или это просто нехороший способ?

теоретический вопрос, код, конечно, можно реорганизовать.

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