2012-01-13 55 views
0

鄉親內,嵌套「for」循環是「嘗試」運營商

我辭職自己解決此問題的工作,但我想檢查Python是否真的充當預期。

在這個例子中,「sample.txt」是任何多行文本文件,它被讀取和解析。

try: 
    file=open('sample.txt','r') 
    for line in file: 
      (some action here) 
except: 
    print "Couldn't open file" 
file.close() 

我觀察到的操作是打開「sample.txt」並處理第一行,然後邏輯進入「except」子句。

WAD還是這個bug?

+8

您應該總是捕獲特定的異常,如FileNotFoundException。不要只是冒險,否則你會遇到這樣的問題,你不知道爲什麼有什麼失敗。 – Interrobang 2012-01-13 18:17:51

+0

for循環中的確切代碼是什麼? – 2012-01-13 20:34:52

回答

6

如果except塊中的代碼運行,那是因爲引發了異常。你吞下了這個例外,這使得很難知道發生了什麼問題。

您的錯誤消息表明您正試圖捕獲打開的文件中引發的錯誤。但是由於您的try塊圍繞文件的整個處理,處理中引發的異常(與打開文件相反)將被錯誤地報告爲「無法打開文件」。如果你真的必須處理異常,那麼你需要將for循環移到except塊之後。

個人而言,我會傾向於簡單地忽略異常,並讓異常中止執行,默認的處理:

with open('sample.txt','r') as file: 
    for line in file: 
     (some action here) 

如果必須處理異常,然後被挑剔的關於您處理類異常。例如,只處理IOError,因爲那是open在失敗的情況下引發的。

try: 
    with open('sample.txt','r') as file: 
     for line in file: 
      (some action here) 
except IOError: 
    except IOError as (errno, strerror): 
     print "I/O error({0}): {1}".format(errno, strerror) 
+0

5秒開始!誰會贏得比賽? – Claudiu 2012-01-13 18:17:19

3

然後在open那一行沒有失敗。什麼是例外?

try: 
    file=open('sample.txt','r') 
    for line in file: 
      (some action here) 
except: 
    print "Exception:" 
    import traceback; traceback.print_exc() 

file.close() 
+0

for循環中的確切代碼是什麼? – 2012-01-13 18:21:47

+0

你應該問OP – Claudiu 2012-01-13 20:26:24

2

except漁獲所有異常,包括那些在(some action here)部分。重組作爲:

try: 
    inputfile = open('sample.txt', 'r') 
except: 
    print "Couldn't open file" 
else: 
    for line in inputfile: pass 
    inputfile.close() 

甚至更​​好:

with open('sample.txt', 'r') as inputfile: 
    for line in inputfile: pass 

一般來說,只有裹try塊內部的代碼可能的最低限度的金額,這樣你不小心處理你的例外沒有真正準備處理。

1

如果由於某種原因open()調用失敗,您的代碼將冒另一個嘗試關閉文件的斷言。這是因爲如果open()引發異常,那麼文件變量將不會被設置,因此進一步調用將引用一個不存在的變量。

如果可能的話,請嘗試使用具有聲明:

with open('sample.txt', 'r') as file: 
    try: 
     for line in file: 
      (some action) 
    except: 
     print "Exception" 
     import traceback; traceback.print_exc() 

這將確保該文件被關閉之後,無論裏面發生了什麼with語句。

0

嘗試使用readlines生成文件中所有行的列表。而且你也不應該在沒有至少打印錯誤代碼的情況下捕捉到一般錯誤。

try: 
    file=open('sample.txt','r') 
    for line in file.readlines(): 
      (some action here) 
except Exception, e: 
    print str(e) 
file.close() 
0

我觀察的行動是「sample.txt的」被打開,並且處理所述第一線,所述邏輯然後下落通過以「除」條款。

是的,是這樣。但是這隻發生在,只要文件存在即可。

至於通過except子句(假設文件存在)的錯誤,這意味着您實現的解析邏輯存在問題。我們不能確定它是什麼,因爲except捕捉到了所有的東西,除非它被重新提出(可能還沒有抓住它,然後......),或者你print the stack trace from the exception object,你不能說出什麼地方出錯或在哪裏。總的來說,這就是爲什麼捕捉所有東西的原因。它使調試變得不必要的困難。

我還注意到你正在關閉文件的最後。這可能是錯誤的另一個來源,因爲該文件只存在於try的範圍內。你有兩個選擇:

  1. 包括file.close()try塊的內部,該文件被正確關閉大功告成後,或
  2. 使用with語句上下文管理器自動關閉文件時,你」重做。 @大衛Heffernan的例子是一個類似於我會寫的。