Если у вас есть полностью отдельные задачи для выполнения в зависимости от того, какая функция не выполнена, как, кажется, показывает ваш код, то отдельные блоки try / exec, как предлагают существующие ответы, могут быть лучше (хотя, возможно, вам придется пропустить второй расстаться, если первый не удался).
Если у вас есть много вещей, которые вам нужно сделать в любом случае, и только небольшой объем работы, который зависит от того, какая функция не сработала, то разделение может создать много дублирования и повторения, поэтому предложенная вами форма вполне может быть предпочтительнее , В этом случае может помочь модуль traceback в стандартной библиотеке Python:
import os, sys, traceback
try:
os.mkdir('/valid_created_dir')
os.listdir('/invalid_path')
except OSError, msg:
tb = sys.exc_info()[-1]
stk = traceback.extract_tb(tb, 1)
fname = stk[0][2]
print 'The failing function was', fname
Конечно, вместо print
вы будете использовать if
проверки, чтобы точно решить, какую обработку делать.