2017-01-08 1 views
-1
try : 
    doSomething1() 
    doSomething2() 
    doSomething3() 
except Exception as e : 
    doSomething4() 
} 

Я знаю, что в приведенном выше коде Если doSomething1() не удался doSomething2() & doSomething3() не выполнит, и он перескочит на doSomething4().
Но я хочу кое-где, если ни на из doSomething1() or doSomething2() or doSomething2() выходит из строя вся попытка не запускается на выполнение и скачет на doSomething4()
На самом деле я работаю с базой данных и в try создать две строки, но иногда второй строки не удается, и первая одна нет, но я не хочу, чтобы 1-я строка была сохранена, когда вторая не удалась. Я хочу, чтобы они оба выполняли или терпели неудачу. Как?Как выполнить только Если все утверждения в try не сработают?

+6

Если вы работаете в базе данных, не можете ли вы использовать транзакцию и откатить ошибку? – Lucero

+1

Да, похоже, вам нужно транзакционное поведение.Вы должны сделать это, используя инструменты, доступные в вашем драйвере базы данных, а не с наивной обработкой ошибок Python. – jonrsharpe

+1

Python не может вернуться во времени. Как только что-то будет сделано, его нельзя отменить автоматически. – Barmar

ответ

0

Вы хотите, что если какой-либо из метода 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; иначе он не запускается.