Python игнорировать исключения и вернуться туда, где я был

Я знаю, как использовать приведенный ниже код, чтобы игнорировать определенное исключение, но как позволить коду вернуться туда, где он получил исключение, и продолжить выполнение? Скажем, если в do_something1 возникает исключение «Exception», как заставить код игнорировать его и продолжать завершать do_something1 и обрабатывать do_something2? Мой код просто перейти к блоку finally после прохода процесса, кроме блока. Пожалуйста, посоветуйте, спасибо.

try:
    do_something1
    do_something2
    do_something3
    do_something4
except Exception:
    pass
finally:
    clean_up

РЕДАКТИРОВАТЬ: Спасибо за ответ. Теперь я знаю, как правильно это сделать. Но вот еще один вопрос, могу ли я просто проигнорировать конкретное исключение (скажем, знаю ли я номер ошибки). Возможен ли приведенный ниже код?

try:
    do_something1
except Exception.strerror == 10001:
    pass

try:
    do_something2
except Exception.strerror == 10002:
    pass
finally:
    clean_up

do_something3
do_something4
 S.Lott29 сент. 2010 г., 04:48
Msgstr "Возможно ниже кода". Сначала попробуйте. Тогда задавайте вопросы, если это не сработало.
 Lie Ryan29 сент. 2010 г., 01:50
это звучит как VBon error resume next
 Lie Ryan29 сент. 2010 г., 01:55
@AaronMcSmooth: попробуйте тыкнуть в это мертвое тело там
 aaronasterling29 сент. 2010 г., 01:52
@ Ли Райан. VB по-прежнему считается живым языком?
 aaronasterling29 сент. 2010 г., 01:45
да, вы можете сделать это, но не так, как написано. Я обновил свой ответ.

Ответы на вопрос(6)

Если первый оператор выдал исключение, система находится в неопределенном состоянии, и вы должны рассматривать следующий оператор как небезопасный для выполнения.

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

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

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

Что если вы напишите код, чтобы открыть файл и прочитать его? Что делать, если этот файл не существует?

Гораздо лучше поднять исключение. Вы не можете прочитать файл, где его нет. Что вы можете сделать, это обработать исключение, сообщить пользователю, что такого файла не существует. Какое преимущество получит продолжение чтения файла, когда файл вообще не может быть открыт.

Фактически вышеупомянутые ответы, предоставленные Аароном, работают по принципу обработки ваших исключений.

функция, котораявозвращается функция, которая игнорирует («ловушки») указанные исключения при вызове любой функции. Затем вы вызываете нужную функцию косвенно через «ловушку».

def maketrap(*exceptions):
    def trap(func, *args, **kwargs):
        try:
            return func(*args, **kwargs)
        except exceptions:
            return None
    return trap

# create a trap that ignores all exceptions
trapall = maketrap(Exception) 

# create a trap that ignores two exceptions
trapkeyattrerr = maketrap(KeyError, AttributeError)

# Now call some functions, ignoring specific exceptions
trapall(dosomething1, arg1, arg2)
trapkeyattrerr(dosomething2, arg1, arg2, arg3)

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

если вы пытаетесь выполнить эти различные независимые действия и продолжаете их выполнять при сбое (без копирования / вставки блока try / Кроме), вам нужно написать что-то вроде этого:

actions = (
    do_something1, do_something2, #...
    )
for action in actions:
    try:
        action()
    except Exception, error:
        pass
Решение Вопроса

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

try:
    do_something1
except TheExceptionTypeThatICanHandleError, e:
    if e.strerror != 10001:
        raise
finally:
     clean_up

Обратите внимание, что каждыйtry Заявление нуждается в своем собственномfinally пункт, если вы хотите, чтобы он был. Он не будет «привязываться» к предыдущемуtry заявление.raise Утверждение с ничем иным является правильным способом повторного вызова последнего исключения. Не позволяйте никому говорить вам иначе.

То, что вы хотите, это продолжения, которые Python не предоставляет изначально. Кроме того, ответ на ваш вопрос зависит от того, что именно вы хотите сделать. Если ты хочешьdo_something1 продолжить независимо от исключений, затемЭто пришлось бы ловить исключения и игнорировать их сам.

если ты просто хочешьdo_something2 случиться независимо от того, еслиdo_something1 завершает, вам нужен отдельныйtry заявление для каждого.

try:
   do_something1()
except:
   pass

try:
   do_something2()
except:
   pass

и т. д. Если вы можете предоставить более подробный пример того, что именно вы хотите сделать, то есть большая вероятность, что я или кто-то умнее меня может либо помочь вам, либо (что более вероятно) отговорить вас от этого и предложить более разумная альтернатива.

 Stan29 сент. 2010 г., 01:47
Большое спасибо @AaronMcSmooth и всем остальным!
 Sanjay Manohar29 сент. 2010 г., 01:34
Да, логика такова,Exception Предполагается, что они должны сигнализировать об условиях, когда нормальный поток не может продолжаться: ваша программа нуждается в переадресации. Двойственно,try блоки должны разделять код, который «последовательно зависит» от того, что было раньше.

вы могли бы иметь всеdo_somethingв списке, и перебирайте их, как это, так что это не так многословно. Вместо этого вы можете использовать лямбда-функции, если вам нужны аргументы для рабочих функций

work = [lambda: dosomething1(args), dosomething2, lambda: dosomething3(*kw, **kwargs)]

for each in work:
    try:
        each()
    except:
       pass

cleanup()
 Blazer29 сент. 2010 г., 01:36
Я понял, как только я опубликовал это, что был похожий комментарий, смеется. извиняюсь.

Ваш ответ на вопрос