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 が 1 か所だけ呼び出されたかどうかを簡単に判断できます

于 2009-05-18T12:19:37.693 に答える
0

さて、このページによると、パート7.4:

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

これはpython ver.で可能です。>= 2.6。私は試してみることを意味します..例外..最終的に構築します。

于 2009-05-18T12:21:18.690 に答える