web-dev-qa-db-ja.com

catch in catchブロックで例外が発生した後、tryブロックでコードを再度実行することは可能ですか?

例外がキャッチされた後、tryブロックでコードを再度実行したい。それはどういうわけか可能ですか?

例えば:

try
{
    //execute some code
}
catch(Exception e)
{
}

例外がキャッチされた場合、もう一度tryブロックに移動して「コードを実行」し、もう一度実行してみます。

18
Infant Dev

ループに入れます。おそらく、最終的に終了するタイミングを制御するブールフラグの周りにwhileループがあります。

bool tryAgain = true;
while(tryAgain){
  try{
    // execute some code;
    // Maybe set tryAgain = false;
  }catch(Exception e){
    // Or maybe set tryAgain = false; here, depending upon the exception, or saved details from within the try.
  }
}

無限ループを回避するように注意してください。

より適切な方法は、独自のメソッド内に「コード」を配置することです。その場合、tryとcatchの両方からメソッドを適切に呼び出すことができます。

38
ziesemer

ブロックをメソッドでラップすると、再帰的に呼び出すことができます

void MyMethod(type arg1, type arg2, int retryNumber = 0)
{
    try
    {
        ...
    }
    catch(Exception e)
    {
        if (retryNumber < maxRetryNumber)
            MyMethod(arg1, arg2, retryNumber+1)
        else
            throw;
    }
}

または、ループでそれを行うことができます。

int retries = 0;

while(true)
{
    try
    {
        ...
        break; // exit the loop if code completes
    }
    catch(Exception e)
    {
        if (retries < maxRetries)
            retries++;
        else
            throw;
    }
}
5
SynXsiS
int tryTimes = 0;
while (tryTimes < 2) // set retry times you want
{
    try
    {
        // do something with your retry code
        break; // if working properly, break here.
    }
    catch
    {
        // do nothing and just retry
    }
    finally
    {
        tryTimes++; // ensure whether exception or not, retry time++ here
    }
}
4
David Smith
3

これを行う別の方法があります(他の人が述べたように、実際には推奨されません)。 VB6のRubyにあるretryキーワードにさらに一致させるためにファイルダウンロードの再試行を使用する例を次に示します。

RetryLabel:

try
{
    downloadMgr.DownLoadFile("file:///server/file", "c:\\file");
    Console.WriteLine("File successfully downloaded");
}
catch (NetworkException ex)
{
    if (ex.OkToRetry)
        goto RetryLabel;
}
1
Bill

Ole gotoの何が問題になっていますか?

 Start:
            try
            {
                //try this
            }
            catch (Exception)
            {

                Thread.Sleep(1000);
                goto Start;
            }
1
LastTribunal

これはうまくいくはずです:

count = 0;
while (!done) {
  try{
    //execute some code;
    done = true;
  }
  catch(Exception e){
  // code
  count++;
  if (count > 1) { done = true; }
  }
}
0
Richard Rhyan