5

次のようなコードがあります。

try
{
Work:

   while(true)
   {
      // Do some work repeatedly...
   }
}
catch(Exception)
{
   // Exception caught and now I can not continue 
   // to do my work properly

   // I have to reset the status before to continue to do my work
   ResetStatus();

   // Now I can return to do my work
   goto Work; 
}

を使用するよりも優れた代替手段はありgotoますか? それともこれは良い解決策ですか?

4

4 に答える 4

16

本当にループが必要なようです。私はそれを次のように書きます:

bool successful = false;
while (!successful)
{
    try
    {
        while(true)
        {
            // I hope you have a break in here somewhere...
        }
        successful = true;
    }
    catch (...) 
    {
        ...
    }
}

do代わりに/whileループを使用することをお勧めします。私はストレートループを好む傾向がありますが、それは個人的な好みであり、ここでそれがどのように適切であるかを見ることができます。while

でも使いませgotoん。コードを追跡しにくくする傾向があります。

もちろん、本当に無限ループが必要な場合try/catchは、ループの内側に配置するだけです。

while (true)
{
    try
    {
        ...
    }
    catch (Exception)
    {
        ...
    }
}
于 2012-11-07T17:13:28.120 に答える
10

Goto使用するのに適切な構成はめったにありません。使用法は、コードを見る人の99%を混乱させ、技術的に正しい使用法でさえ、コードの理解を大幅に遅くします。

ほとんどの場合、コードをリファクタリングすると、の必要性(または使用したい)がなくなりますgoto。つまり、あなたの特定のケースでは、あなたは単にtry/catch内部を動かすことができますwhile(true)。反復の内部コードを別の関数にすると、さらにクリーンになる可能性があります。

while(true)
{
  try
  {
      // Do some work repeatedly...
  }
  catch(Exception)
  {
   // Exception caught and now I can not continue 
   // to do my work properly

   // I have to reset the status before to continue to do my work
   ResetStatus();
  }
}
于 2012-11-07T17:12:53.167 に答える
0

try/catch を while ループに移動する方が理にかなっているように思われます。次に、エラーを処理するだけで、ループはラベルと goto を使用して制御フローをルーティングする必要なく、通常どおり続行されます。

于 2012-11-07T17:15:29.340 に答える
-2

反復ごとに状態をキャッチして復元します。外側をキャッチしても同じように機能しますが、ここではまだループ内にあり、ループを続行するか、ループを中断するかを決定できます。

ALSO:最初から an をキャッチするのExceptionは間違っています (キャッチした場合、StackOverflowExceptionまたはMemoryLeachException-編集: これは単なる例です。ドキュメントを確認して、実際に何をキャッチできるかを確認してください)。スローされると予想される具体的なタイプの例外をキャッチします。

while(true)
{
    try
    {
        // Do some work repeatedly...
    }
    catch(FileNotFoundException) //or anything else which you REALLY expect.
    {
        // I have to reset the status before to continue to do my work
        ResetStatus();
        //decide here if this is till OK to continue loop. Otherwise break.
    }
}

コメントで非常に賢い人のために:一般的な例外をキャッチしないのはなぜですか

于 2012-11-07T17:16:16.253 に答える