3

一般的な Try-Finally 例外クリーンアップ パターンと同等のセマンティクスを探しています。

コードが成功するか失敗するかに関係なく、クリーンアップ手順を実行する必要がありますが、クリーンアップ コードがエラーの報告と処理を妨げてはならないという考えです。まだ問題が発生しており、例外は引き続き伝播するはずです。

私はこのようなものを書きたいと思います:

O TempFile:(/NEW:/WRITE:/STREAM)
U TempFile
L +LockName
TRY {
 ...code that uses TempFile and may throw an error
} FINALLY {
 //Be sure to delete file whether we have an error or not
 O TempFile:(/DELETE)
 C TempFile
 //Be sure to release lock
 L -LockName
}
... Rest of code that should only execute if there was no error

ただし、ObjectScript の TRY...CATCH 構文は、FINALLY 句をサポートしていません。

特に、finally ブロックによって通常行われるこれらの両方が当てはまることが重要です。

  • クリーンアップ コードは、エラーが発生した場合とすべてが正常に実行された場合の両方で、実行が呼び出し元に返される前に常に実行されます。
  • エラーが発生した場合、コードの場所、コンテキスト、およびスタックを含む元のエラーが、呼び出しスタックを元の呼び出し元に伝達されます。クリーンアップ コードがデバッグを妨げないようにする必要があります。

通常の TRY...CATCH ブロックを単純に使用することはできません。なぜなら、CATCH は例外を食べて、正しいエラー コンテキストがチェーンに渡されないようにするからです。エラーコンテキストを台無しにすることなく、元の例外を再スローする方法があるのではないでしょうか?

4

2 に答える 2

2

キャッチされたエラーをスローすることができ、それは元のエラーであり、元のエラーの場所とその他のものであるため、Try-Finally は次のようになります。

try {
    // some code that could be with errors
} catch ex {
}
// finally

throw:$g(ex) ex
// rest code that can't execute if was error
于 2014-08-19T20:39:46.387 に答える