Сообщение об исключении (Python 2.6)

В Python, если я открываю двоичный файл, который не существует, программа выходит с ошибкой и печатает:

Traceback (most recent call last):
  File "C:\Python_tests\Exception_Handling\src\exception_handling.py", 
  line 4, in <module>
  pkl_file = open('monitor.dat', 'rb')
  IOError: [Errno 2] No such file or directory: 'monitor.dat'

Я могу справиться с этим с помощью try-except, например:

try:
    pkl_file = open('monitor.dat', 'rb')
    monitoring_pickle = pickle.load(pkl_file)
    pkl_file.close()
except Exception:
    print 'No such file or directory'

Как я мог в catch catch Exception напечатать следующую строку?

File "C:\Python_tests\Exception_Handling\src\exception_handling.py", 
line 11, in <module>
pkl_file = open('monitor.dat', 'rb')

Таким образом, программа не выйдет.

Ответ 1

Отправляет сообщение об ошибке:

except Exception, e:
    print "Couldn't do it: %s" % e

Это покажет всю трассировку:

import traceback

# ...

except Exception, e:
    traceback.print_exc()

Но вы можете не захотеть поймать Исключение. Чем уже вы можете сделать свой улов, тем лучше. Поэтому вы можете попробовать:

except IOError, e:

вместо этого. Кроме того, что касается сужения обработки исключений, если вы беспокоитесь только о недостающих файлах, тогда установите try-except только вокруг open:

try:
    pkl_file = open('monitor.dat', 'rb')
except IOError, e:
    print 'No such file or directory: %s' % e

monitoring_pickle = pickle.load(pkl_file)
pkl_file.close()

Ответ 2

Если вы хотите захватить объект исключения, переданный Exception, лучше начать использовать формат NEW, введенный в Python 2.6 (который в настоящее время поддерживает оба), поскольку он будет единственным способом сделать это в Python 3.

И это:

try:
    ...
except IOError as e:
    ...

Пример:

try:
    pkfile = open('monitor.dat', 'rb')
except IOError as e:
    print 'Exception error is: %s' % e

Подробный обзор можно найти в Что нового в документации Python 2.6.

Ответ 3

Python имеет traceback модуль.

import traceback
try:
    pkl_file = open('monitor.dat', 'rb')
    monitoring_pickle = pickle.load(pkl_file)
    pkl_file.close()
except IOError:
    traceback.print_exc()

Ответ 4

Спасибо всем.

Вот что мне нужно:)

import traceback

try:
    # boom
except Exception:
    print traceback.format_exc()