2013-09-25 3 views
8

Я пытаюсь прочитать все файлы из папки, соответствующей определенным критериям. Моя программа вылетает после того, как у меня возникло исключение. Я пытаюсь продолжить, даже если есть исключение, но оно все равно перестает выполняться.Сделать код python продолжен после исключения

Это то, что я получаю через пару секунд.

error <type 'exceptions.IOError'> 

Вот мой код

import os 
path = 'Y:\\Files\\' 
listing = os.listdir(path) 
try: 
    for infile in listing: 
     if infile.startswith("ABC"): 
      fo = open(infile,"r") 
      for line in fo: 
       if line.startswith("REVIEW"): 
        print infile 
      fo.close() 
except: 
    print "error "+str(IOError) 
    pass 
+0

«Я пытаюсь продолжать, даже если есть исключения» - никогда не делайте этого, если у вас нет четкого плана, как ваша программа должна быть продолжена. Предполагая, что ваш код после блока except: зависит от содержимого файла, продолжайте работу после ошибки ввода-вывода, это плохая идея. Пусть исключение приведет к сбою программы, чтобы вы могли заметить и исправить основную проблему. –

ответ

25

Положите вашу try/except структуру более в палатах. В противном случае, когда вы получите сообщение об ошибке, он сломает все циклы.

Возможно, после первой петли, добавьте try/except. Затем, если возникает ошибка, она будет продолжена с последующим файлом.

for infile in listing: 
    try: 
     if infile.startswith("ABC"): 
      fo = open(infile,"r") 
      for line in fo: 
       if line.startswith("REVIEW"): 
        print infile 
      fo.close() 
    except: 
     pass 

Это прекрасный пример того, почему вы должны использовать with заявление здесь, чтобы открыть файлы. Когда вы открываете файл с помощью open(), но ошибка поймается, файл останется открытым навсегда. Теперь лучше, чем никогда.

for infile in listing: 
    try: 
     if infile.startswith("ABC"): 
      with open(infile,"r") as fo 
       for line in fo: 
        if line.startswith("REVIEW"): 
         print infile 
    except: 
     pass 

Теперь, если ошибка перехвачена, файл будет закрыт, так как это то, что делает with заявление.

2

Вы код, который делает именно то, что вы говорите ему. Когда вы получите исключение, он спрыгивает в этом разделе:

except: 
    print "error "+str(IOError) 
    pass 

Поскольку нет ничего после этого, программа завершается.

Кроме того, это pass является излишним.

+0

Я пытаюсь передать ошибку и двигаться вперед. – Ank

+2

@ Анукур 'pass' означает« ничего не делать ». Ваш код будет продолжен без него. Проблема в том, что для блока 'except' ничего не нужно делать. –

3

Переместить попытку/исключая внутри цикла for. Как и в:

import os 
    path = 'C:\\' 
    listing = os.listdir(path) 
    for infile in listing: 
     try:  
      if infile.startswith("ABC"): 
       fo = open(infile,"r") 
       for line in fo: 
        if line.startswith("REVIEW"): 
         print infile 
       fo.close() 
     except: 
       print "error "+str(IOError) 
Смежные вопросы