0

TRY ブロックがあるとします。ファイルに書き込もうとしましたが、ファイルが存在しないため、例外がスローされます。

try
{
     TryWritingToFile();          
}
catch (Exception)
{
     CreateFile();
     //now I want to go back and try to write to the file again. 
}

try ブロックの先頭に戻るにはどうすればよいですか? catch ブロックで「再試行」する必要がありますか? これは繰り返しコードではありませんか?

4

5 に答える 5

4
bool ok = false; 

while(!ok)
{    
    try
    {
        TryWritingToFile();          
        ok = true; 
    }
    catch (Exception)
    {
        CreateFile();
        //now I want to go back and try to write to the file again. 
    }
}
于 2012-09-20T22:01:19.633 に答える
1

try ブロックの先頭に戻るにはどうすればよいですか?

できませんが、同じ関数を再度呼び出すことができます-再帰。

グローバルException例外をキャッチすることは、ベスト プラクティスとは見なされないことに注意してください。

于 2012-09-20T21:57:48.623 に答える
0

この種の効果は、次のような複雑なトリックで実現できます。

bool success = false;
while(!success)
{
    try
    {
        WriteToFile();
        success = true;
    }
    catch()
    {
        CreateFile();
    }
}

しかし、それらはすべて問題があり、絶対に避けるべきです。制御フローはそれほど明白ではなく、多くの場合、追加の欠点があります。たとえば、上記のコードは無限ループの良いレシピです。

このような状況での問題の根本は、通常、制御フロー メカニズムとして例外を使用していることにあります。たとえば、ここでは、ファイルが存在するかどうかを通知するために例外に依存しています。例外によって制御フローが中断され、パフォーマンスが低下するため、これは問題です。より良いオプションは、コードを再配置して、例外に依存して例外的な状況以外を伝達しないようにすることです。ほとんどの場合、例外が何を伝えているかを理解するための、より直接的な (そしてより効率的な) 方法があります。

例えば:

if(!CheckFileExists()) CreateFile();
WriteToFile();
于 2012-09-20T22:07:09.697 に答える
0

.NET ではサポートされていますが、C# ではサポートされていません。VB.NET、F#、または C++/CLI を使用します。またはMSILかもしれません。

EXCEPTION_CONTINUE_EXECUTIONそして、例外フィルター式で返される.NETの同等物が何であるかはよくわかりません。


これが例外フィルターで行われなければならない理由は、例外フィルターが最初の例外処理中に評価され、コール スタックがまだ無傷であるためです。2 回目の例外処理中に catch ブロックが実行されるまでに、スタックの巻き戻しが既に開始されており、コール スタックに存在しなくなったコール フレームの実行を再開する方法はありません。

于 2012-09-20T21:58:26.567 に答える
0

基本クラスの Exception ではなく、特定のファイル I/O 例外をここでキャッチする方がよい場合があります。

コード ブロック全体を while ループでラップして、成功時に設定される何らかの bool をチェックしないのはなぜですか?

于 2012-09-20T22:00:47.727 に答える