Вы хотите, что если какой-либо из метода doSomething1
, doSomething2
и doSomething3
не удается, то try
блок пропускается, и метод doSomething4
запускается.
Ну, это не логично. Если doSomething1
терпит неудачу, то он был выполнен, поэтому целое try
больше не может быть полностью пропущено. То же самое для doSomething2
: если он терпит неудачу, то он был запущен, и doSomething1
не сработал, поэтому только doSomething3
все еще можно пропустить.
Вот несколько разных способов поведения, которые вы можете реализовать.
Поведение 1
try:
doSomething1()
doSomething2()
doSomething3()
except:
doSomething4()
Пытается запустить doSomething1
, doSomething2
и doSomething3
. Если один из них не работает, следующие пропускаются, и выполняется doSomething4
. Else, doSomething4
пропущен.
Поведение 2
try:
doSomething1()
doSomething2()
doSomething3()
finally:
doSomething4()
Пытается запустить doSomething1
, doSomething2
и doSomething3
. Если один из них не работает, пропускаются следующие. В любом случае в конце выполняется doSomething4
.
Поведение 3
try:
doSomething1()
except:
try:
doSomething2()
except:
pass
else:
try:
doSomething3()
except:
pass
else:
doSomething4()
else:
try:
doSomething2()
except:
try:
doSomething3()
except:
pass
else:
doSomething4()
else:
try:
doSomething3()
except:
doSomething4()
Если точно один из doSomething1
, doSomething2
и doSomething3
повреждается, doSomething4
запускается. Это поведение может быть реализовано гораздо проще с помощью управления исключениями neater, но этот код имеет смысл использовать только try
s, except
s и else
s.
Поведение 4
Это то, что соответствует названию вашего вопроса. Если ни один из doSomething1
, doSomething2
и doSomething3
не выполнен, выполняется doSomething4
; иначе он не запускается.
Если вы работаете в базе данных, не можете ли вы использовать транзакцию и откатить ошибку? – Lucero
Да, похоже, вам нужно транзакционное поведение.Вы должны сделать это, используя инструменты, доступные в вашем драйвере базы данных, а не с наивной обработкой ошибок Python. – jonrsharpe
Python не может вернуться во времени. Как только что-то будет сделано, его нельзя отменить автоматически. – Barmar