2009-05-18 37 views
3
  • 我想避免在多個位置寫入errorCount += 1
  • 我在尋找一個更好的方式比
 
    success = False 
    try: 
     ... 
    else: 
     success = True 
    finally: 
     if success: 
      storage.store.commit() 
     else: 
      storage.store.rollback() 
  • 我試圖避免在每個store.rollback()除外條款。

有關如何做到這一點的任何想法?嘗試...除...以外...:如何避免重複代碼

count = 0 
successCount = 0 
errorCount = 0 
for row in rows: 
    success = False 
    count += 1 
    newOrder = storage.RepeatedOrder() 
    storage.store.add(newOrder) 
    try: 
     try: 
      newOrder.customer = customers[row.customer_id] 
     except KeyError: 
      raise CustomerNotFoundError, (row.customer_id,) 
     newOrder.nextDate = dates[row.weekday] 
     _fillOrder(newOrder, row.id) 
    except CustomerNotFoundError as e: 
     errorCount += 1 
     print u"Error: Customer not found. order_id: {0}, customer_id: {1}".format(row.id, e.id) 
    except ProductNotFoundError as e: 
     errorCount += 1 
     print u"Error: Product not found. order_id: {0}, product_id: {1}".format(row.id, e.id) 
    else: 
     success = True 
     successCount += 1 
    finally: 
     if success: 
      storage.store.commit() 
     else: 
      storage.store.rollback() 
print u"{0} of {1} repeated orders imported. {2} error(s).".format(successCount, count, errorCount) 

回答

8

這看起來像Python的新with聲明的可能應用。它允許放寬操作並釋放資源,無論代碼塊具有什麼結果。

閱讀關於它的信息PEP 343

2

你可以簡單地包裹起來的例外實施例外特定容器類裏面,這樣你也能避免所有這些明確的打印電話(這可能會派上用場,一旦你改變你的接口,例如支持GUI時),相反,你會有一個像錯誤(味精)的方法,這反過來可以相應地在內部增加錯誤計數。換句話說,只需設置一個管理異常處理內容的外部輔助類即可。

0

如果你喜歡累積錯誤,爲什麼你不累積錯誤?如果您將錯誤消息放在列表中,則列表的大小將提供您需要的信息。你甚至可以後處理一些東西。

http://docs.python.org/reference/compound_stmts.html

這是可能的Python版本:如果發生錯誤並打印只在一個地方

0

好叫,根據這個頁面,部分7.4你可以決定容易。 > = 2.6。我的意思是try..except..finally建設。

+0

我想你們誤解了我的問題。 – 2009-05-18 12:35:04

3

我的建議是編寫一個logError()方法,它增加errorCount(使其成爲一個成員變量)並打印錯誤。由於您的異常代碼是類似的,你也可以通過這樣縮短代碼:

try: 
    # something 
except (CustomerNotFoundError, ProductNotFoundError), e: 
    logError(e) 

您可以打印基於e任何你想要的。

而且,你不需要跟蹤succeses:successCount = len(rows) - errorCount

+0

successCount = len(rows) - errorCount:在我的示例中並不總是有效,因爲我並不總是直接使用行。 – 2009-05-18 13:22:09

+0

有許多很好的理由讓一個方法處理異常對象,並在代碼捕獲到一個錯誤的異常時調用它。 – 2009-05-18 18:38:13