У меня появилось много строк подряд, которые могут генерировать исключение, но, несмотря ни на что, он должен продолжать следующую строку. Как это сделать без индивидуальной попытки поймать каждый оператор, который может вызывать исключение?
try:
this_may_cause_an_exception()
but_I_still_wanna_run_this()
and_this()
and_also_this()
except Exception, e:
logging.exception('An error maybe occured in one of first occuring functions causing the others not to be executed. Locals: {locals}'.format(locals=locals()))
Посмотрите выше код, все функции могут генерировать исключения, но он должен выполнять следующие функции независимо от того, выбрал ли оно исключение или нет. Есть ли хороший способ сделать это?
Я не хочу этого делать:
try:
this_may_cause_an_exception()
except:
pass
try:
but_I_still_wanna_run_this()
except:
pass
try:
and_this()
except:
pass
try:
and_also_this()
except:
pass
Я думаю, что код должен продолжать работать после исключения, только если критическое значение (компьютер будет гореть или вся система будет запутана, она должна остановить всю программу, но для многих мелких вещей также исключены исключения такие как соединение не удалось и т.д.) У меня обычно нет проблем с обработкой исключений, но в этом случае я использую стороннюю библиотеку, которая легко генерирует исключения для небольших вещей.
Посмотрев на ответ m4spy, я подумал, что это невозможно, чтобы иметь декоратор, который позволит каждой строке функции выполнять, даже если один из них вызывает исключение.
Что-то вроде этого было бы круто:
def silent_log_exceptions(func):
@wraps(func)
def _wrapper(*args, **kwargs):
try:
func(*args, **kwargs)
except Exception:
logging.exception('...')
some_special_python_keyword # which causes it to continue executing the next line
return _wrapper
Или что-то вроде этого:
def silent_log_exceptions(func):
@wraps(func)
def _wrapper(*args, **kwargs):
for line in func(*args, **kwargs):
try:
exec line
except Exception:
logging.exception('...')
return _wrapper
@silent_log_exceptions
def save_tweets():
a = requests.get('http://twitter.com)
x = parse(a)
bla = x * x