2009-05-18 71 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