例外がキャッチされた後、tryブロックでコードを再度実行したい。それはどういうわけか可能ですか?
例えば:
try
{
//execute some code
}
catch(Exception e)
{
}
例外がキャッチされた場合、もう一度tryブロックに移動して「コードを実行」し、もう一度実行してみます。
ループに入れます。おそらく、最終的に終了するタイミングを制御するブールフラグの周りに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の両方からメソッドを適切に呼び出すことができます。
ブロックをメソッドでラップすると、再帰的に呼び出すことができます
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;
}
}
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
}
}
これを行う別の方法があります(他の人が述べたように、実際には推奨されません)。 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;
}
Ole goto
の何が問題になっていますか?
Start:
try
{
//try this
}
catch (Exception)
{
Thread.Sleep(1000);
goto Start;
}
これはうまくいくはずです:
count = 0;
while (!done) {
try{
//execute some code;
done = true;
}
catch(Exception e){
// code
count++;
if (count > 1) { done = true; }
}
}