一連のレコードをファイルに送信するスクリプトがあります。Try - Catch ブロックを使用して例外を処理しています。catch ブロックには、次のレコードへのポインターを持つコードがあります。しかし、これは実行されていません。基本的に、悪いレコードをスキップして次のレコードに移動したい。
while(currentrecord)
{
try
{
writerecord event
}
catch
{
currentrecord = next record
}
}
一連のレコードをファイルに送信するスクリプトがあります。Try - Catch ブロックを使用して例外を処理しています。catch ブロックには、次のレコードへのポインターを持つコードがあります。しかし、これは実行されていません。基本的に、悪いレコードをスキップして次のレコードに移動したい。
while(currentrecord)
{
try
{
writerecord event
}
catch
{
currentrecord = next record
}
}
ほとんどの言語では (非常に変わったものを使用している場合を除きます)、'writerecord イベント' が例外をスローしない場合、catch ブロックは呼び出されません。
そうですか :
while(currentrecord) {
try { writerecord event }
catch { log error }
finally { currentrecord = next record}
}
クエリによって返されたいくつかのレコードをループしようとしていますか? 次のようにします。
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());
}
コードが例外をスローするかどうかに関係なく、finally ブロック内のすべてが常に実行されるように、try-finally 構造を使用できます。ファイルや接続を閉じるなど、リソースをクリーンアップするためによく使用されます。catch 句がないと、try ブロックでスローされた例外は実行を中止し、finally ブロックにジャンプしてそのコードを実行します。
ここでは「最終的に」が最善の策かもしれないことに同意しますが、実際に例外が何であるかを知っていますか? - 次のように、catch ループで出力できますか。
A)例外がスローされていることを証明できます(「null」が返されるなどと言うのではなく)
B) 取得した例外が、'nextrecord' の動作を妨げるようなものではないことを確認してください...[この場合、'finally' が何を達成するかわかりません。おそらく、例外はコードの呼び出しにバブルアップする必要がありますか?
したがって、このレコードをコミットできなかった場合は、次のレコードに移動しようとしています。ロバート・ミュラーは正しかった。説明する...
WriteRecord が失敗した場合、ビジネス コンポーネントは引き続きダーティ レコードに配置されます。次のレコードに移動しようとすると、「暗黙の保存」と呼ばれる機能により、buscomp が再度書き込みを試みます。
解決策: 次の変更に移る前に、失敗したフィールドの変更を破棄するために、レコードを元に戻す (UndoRecord) 必要があります。