1

一連のレコードをファイルに送信するスクリプトがあります。Try - Catch ブロックを使用して例外を処理しています。catch ブロックには、次のレコードへのポインターを持つコードがあります。しかし、これは実行されていません。基本的に、悪いレコードをスキップして次のレコードに移動したい。

while(currentrecord)
{
try
{
writerecord event
}
catch
{
currentrecord = next record
}
}
4

5 に答える 5

4

ほとんどの言語では (非常に変わったものを使用している場合を除きます)、'writerecord イベント' が例外をスローしない場合、catch ブロックは呼び出されません。

そうですか :

while(currentrecord) { 
   try { writerecord event } 
   catch { log error } 
   finally { currentrecord = next record}
}
于 2009-12-10T09:37:00.833 に答える
2

クエリによって返されたいくつかのレコードをループしようとしていますか? 次のようにします。

var yourBusObject = TheApplication().GetBusObject("Your Business Object Name");
var yourBusComp = yourBusObject.GetBusComp("Your Business Component Name");

// activate fields that you need to access or update here
yourBusComp.ClearToQuery();
// set search specs here
yourBusComp.ExecuteQuery(ForwardOnly);

if (yourBusComp.FirstRecord()) {
    do {
        try {
            // update the fields here
            yourBusComp.WriteRecord();
        } catch (e) {
            // undo any changes so we can go to the next record
            // If you don't do this I believe NextRecord() will implicitly save and trigger the exception again.
            yourBusComp.UndoRecord();

            // maybe log the error here, or just ignore it
        }
    } while (yourBusComp.NextRecord());
}
于 2009-12-15T07:19:18.053 に答える
1

コードが例外をスローするかどうかに関係なく、finally ブロック内のすべてが常に実行されるように、try-finally 構造を使用できます。ファイルや接続を閉じるなど、リソースをクリーンアップするためによく使用されます。catch 句がないと、try ブロックでスローされた例外は実行を中止し、finally ブロックにジャンプしてそのコードを実行します。

于 2009-12-10T09:35:42.210 に答える
0

ここでは「最終的に」が最善の策かもしれないことに同意しますが、実際に例外が何であるかを知っていますか? - 次のように、catch ループで出力できますか。

A)例外がスローされていることを証明できます(「null」が返されるなどと言うのではなく)

B) 取得した例外が、'nextrecord' の動作を妨げるようなものではないことを確認してください...[この場合、'finally' が何を達成するかわかりません。おそらく、例外はコードの呼び出しにバブルアップする必要がありますか?

于 2009-12-10T09:52:55.693 に答える
0

したがって、このレコードをコミットできなかった場合は、次のレコードに移動しようとしています。ロバート・ミュラーは正しかった。説明する...

WriteRecord が失敗した場合、ビジネス コンポーネントは引き続きダーティ レコードに配置されます。次のレコードに移動しようとすると、「暗黙の保存」と呼ばれる機能により、buscomp が再度書き込みを試みます。

解決策: 次の変更に移る前に、失敗したフィールドの変更を破棄するために、レコードを元に戻す (UndoRecord) 必要があります。

于 2010-02-05T21:02:54.723 に答える