2013-10-11 4 views
0

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? 
+1

Вы можете вставить выходные данные своей программы? – tback

+4

Стоит отметить, что при работе с файлами в Python вам следует [использовать оператор 'with'] (http://www.youtube.com/watch?v=lRaKmobSXF4), чтобы убедиться, что в подобной ситуации вы закройте файл, даже если есть исключение.Ловить «Исключение» вместо конкретного исключения также является очень плохой идеей - вы поймаете то, что не хотели, приводя к вводящим в заблуждение сообщениям об ошибках или странному поведению. –

+3

Держу пари, ваша ошибка пузырится, потому что вы вызываете дополнительное исключение в своем исключении. Я не думаю, что исключения имеют атрибут «errno». То есть попробуйте избавиться от 'e.errno'. – KobeJohn

ответ

1

Это просто пузырится, как мы упоминали в комментариях, и Александр сказал. Используйте этот код, чтобы узнать, как он может работать (никаких ошибок, но это было просто неприятное удивление, которое вы получили с исключениями).

def f(url): 
    path_to_write = 'test.dat' 
    pdf_data = 'asdf' 
    try: 
     write_to_disk(path_to_write, pdf_data) 
    except Exception as e: 
     print 'Did I jump directly to here?\n' + str(e) 


def write_to_disk(path_to_write, pdf_data): 
    try: 
     print 'Here `1.1' 
     with open(path_to_write, "w+") as fd: 
      print 'Here `2.1' 
      fd.write(pdf_data) 
    except Exception as e: 
     print 'file cannot be opened ' + path_to_write 


f('fake_url') 

Некоторые области, чтобы сделать код более безопасным/более стандарт:

  • сделать как можно меньше внутри Ьгу блока. попытаться изолировать код, который вас беспокоит, может привести к ошибке
  • такое же правило для исключения блока. не делайте ничего странного там.
  • как упоминалось выше, с использованием блока with является более стандартным и читаемым способом работы с файлом.
  • другие мелкие вещи с именами функций и переменных, вы можете увидеть, где я изменил вещи в коде выше. google PEP 8 для получения дополнительной информации.
2

Вашего первый обработчик исключений пытается построить строку с помощью конкатенации другой строки и int (e.errno), который вызывает его (print заявления) бросить само исключение (которое затем перехватываются внешним обработчиком исключений) ,

+0

Оказывается, мне нужно избавиться от errno, чтобы это работало. Как вы обрабатываете или видите ошибки ввода-вывода в вашем коде? – user220201

+0

Почему бы не использовать форматирование: print "Exception thrown:% d"% e.errno –

+0

Объект исключения не имеет переменной errno вообще для меня использовать – user220201

Смежные вопросы