Ниже приведен пример, который я нашел на веб-сайте для Дуга Хеллмана в файле с именем "masking_exceptions_catch.py". Я не могу найти ссылку на данный момент. Исключение, созданное в throws(), отбрасывается, пока сообщается о том, что вызвано очисткой().
В своей статье Дуг замечает, что обработка не интуитивно понятна. В середине ожидания ожидая, что это ошибка или ограничение в версии Python в то время, когда она была написана (около 2009 года), я запустил ее в текущей производственной версии Python для Mac (2.7.6). Он по-прежнему сообщает об исключении из cleanup(). Я нахожу это несколько удивительным и хотел бы увидеть описание того, как это на самом деле правильное или желательное поведение.
#!/usr/bin/env python
import sys
import traceback
def throws():
raise RuntimeError('error from throws')
def nested():
try:
throws()
except:
try:
cleanup()
except:
pass # ignore errors in cleanup
raise # we want to re-raise the original error
def cleanup():
raise RuntimeError('error from cleanup')
def main():
try:
nested()
return 0
except Exception, err:
traceback.print_exc()
return 1
if __name__ == '__main__':
sys.exit(main())
Выход программы:
$ python masking_exceptions_catch.py
Traceback (most recent call last):
File "masking_exceptions_catch.py", line 24, in main
nested()
File "masking_exceptions_catch.py", line 14, in nested
cleanup()
File "masking_exceptions_catch.py", line 20, in cleanup
raise RuntimeError('error from cleanup')
RuntimeError: error from cleanup