尝试......除了......除了......:如何避免重复代码

时间:2009-05-18 12:14:41

标签: python try-catch dry

  • 我想避免在多个地方写errorCount += 1
  • 我正在寻找比
  • 更好的方法
    success = False
    try:
        ...
    else:
        success = True
    finally:
        if success:
            storage.store.commit()
        else:
            storage.store.rollback()
  • 我试图在每个except子句中避免使用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)

5 个答案:

答案 0 :(得分:8)

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

PEP 343

中了解相关信息

答案 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。