4
  • 我想避免errorCount += 1在多个地方写作。
  • 我正在寻找比
    成功 = 假
    尝试:
        ...
    别的:
        成功 = 真
    最后:
        如果成功:
            storage.store.commit()
        别的:
            storage.store.rollback()
  • 我试图避免store.rollback()在每个 except 子句中。

关于如何做到这一点的任何想法?

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)
4

5 回答 5

8

这看起来像是 Python 新with语句的可能应用。无论代码块有什么结果,它都允许安全地展开操作并释放资源。

在PEP 343中了解它

于 2009-05-18T12:25:52.220 回答
3

我的建议是编写一个logError()递增的方法errorCount(使其成为成员变量)并打印错误。由于您的异常代码相似,您还可以通过以下方式缩短代码:

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

您可以根据需要打印任何内容e

此外,您不需要跟踪成功:successCount = len(rows) - errorCount

于 2009-05-18T12:25:37.683 回答
2

你可以简单地将你的异常实现包装在一个异常特定的容器类中,这样你也可以避免所有这些显式的打印调用(一旦你改变你的界面,这可能会派上用场,例如在支持 GUI 时),而不是你会有一个像error(msg)这样的方法,它反过来可以在内部相应地增加错误计数。换句话说,只需设置一个外部帮助类来管理您的异常处理内容。

于 2009-05-18T12:18:30.350 回答
0

如果您喜欢累积错误,为什么不累积错误?如果您将错误消息放在列表中,则列表的大小会提供您需要的信息。您甚至可以对某些内容进行后处理。您可以轻松决定是否发生错误并且仅在一个地方调用 print

于 2009-05-18T12:19:37.693 回答
0

好吧,根据this page,第7.4部分:

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

这在 python 版本中是可能的。>= 2.6。我的意思是尝试..除了..最终构建。

于 2009-05-18T12:21:18.690 回答