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)
答案 0 :(得分:8)
这看起来像是Python的新with
语句的可能应用。它允许解除操作并安全地释放资源,无论代码块有什么结果。
答案 1 :(得分:3)
我的建议是写一个logError()
方法,增加errorCount
(使其成为成员变量)并打印错误。由于您的异常代码类似,您还可以通过以下方式缩短代码:
try:
# something
except (CustomerNotFoundError, ProductNotFoundError), e:
logError(e)
您可以根据e
打印任何内容。
此外,您无需跟踪成功:successCount = len(rows) - errorCount
答案 2 :(得分:2)
您可以简单地将异常实现包装在特定于异常的容器类中,这样您也可以避免所有这些显式打印调用(一旦您更改界面可能会派上用场,例如支持GUI时),而不是将有一个像错误(msg)这样的方法,这反过来可以在内部相应地增加错误计数。换句话说,只需设置一个外部帮助程序类来管理异常处理。
答案 3 :(得分:0)
如果您喜欢累积错误,为什么不累积错误?如果将错误消息放在列表中,列表的大小将提供所需的信息。你甚至可以对事物进行后处理。如果发生错误并且只在一个地方调用打印,您可以轻松决定
答案 4 :(得分:0)
嗯,根据这个页面,第7.4部分:
http://docs.python.org/reference/compound_stmts.html
使用python ver可以实现这一点。 > = 2.6。我的意思是try ..except..finally construction。