Python новичок здесь, и я сталкиваюсь с каким-то странным поведением в моем коде.Обработка исключений в файле python i/O
Я пытаюсь записать некоторые данные в файл. Я печатаю длину данных примерно 50 к, прежде чем я вызову следующий блок кода. Данные - это pdf-файл, который я получил через Интернет. И его действительный pdf.
Когда я вызываю функцию F(), описанную ниже, я получаю сообщение об исключении, напечатанное в функции F, а не в том месте, где оно терпит неудачу.
В приведенном ниже коде в функции write_to_disk() я вижу вторую печать, и выполнение непосредственно переходит к обработчику исключений в вызывающей функции F(). Я не могу понять, почему это происходит. На диске я вижу, что файл создан, но размер равен 0.
Может ли кто-нибудь взглянуть на код ниже и может угадать, что может произойти? Если у меня есть исключения в функции write_to_disk(), как это возможно, чтобы он полностью выпрыгнул из функции?
EDIT: Спасибо за kobejohn, получается, что объект excetion не имеет переменной errno. Избавьтесь от него, сделав печать. Но большая проблема все еще существует. Я вижу неудачу, чтобы не узнать, почему ее неудача. Как получить сообщение об ошибке здесь?
def write_to_disk(self, pathToWrite, pdfFileData):
try:
print 'Here `1.1'
fd = open(pathToWrite, "w+")
print 'Here `2.1'
fd.write(pdfFileData)
print 'Here 3.1'
fd.close()
except Exception as e:
print 'file cannot be opened ' + pathToWrite + e.errno
Эта функция INTURN вызывается другой функцией F, которая, как это -
def F(self, url):
pathWrite = get_path_to_use()
pdfData = get_pdf_data(url)
try:
writetodisk(pathToWrite, pdfData)
except Exception as e:
print 'Did I jump directly to here?' + e.errno
Вот из положить программы. Я не думал, что это добавит что-нибудь, потому что я ничего не вижу, если это используется. Фактически, я получаю тот же вывод, даже когда его запускают в pdb.
Here `1.1
Here `2.1
Did I jump directly to here?
Вы можете вставить выходные данные своей программы? – tback
Стоит отметить, что при работе с файлами в Python вам следует [использовать оператор 'with'] (http://www.youtube.com/watch?v=lRaKmobSXF4), чтобы убедиться, что в подобной ситуации вы закройте файл, даже если есть исключение.Ловить «Исключение» вместо конкретного исключения также является очень плохой идеей - вы поймаете то, что не хотели, приводя к вводящим в заблуждение сообщениям об ошибках или странному поведению. –
Держу пари, ваша ошибка пузырится, потому что вы вызываете дополнительное исключение в своем исключении. Я не думаю, что исключения имеют атрибут «errno». То есть попробуйте избавиться от 'e.errno'. – KobeJohn