このコードサンプルでは、catchブロックから外側のループを続行する方法はありますか?
while
{
// outer loop
while
{
// inner loop
try
{
throw;
}
catch
{
// how do I continue on the outer loop from here?
continue;
}
}
}
更新:この質問は このテーマに関する私の記事です。 のインスピレーションでした。素晴らしい質問をありがとう!
"continue"と "break"は、 "goto"の心地よい構文にすぎません。どうやら彼らにかわいい名前を付け、特定の制御構造にその使用を制限することで、彼らはもはや「すべてのゴトは常に悪い」群衆の怒りを引かない。
あなたがやりたいことが外部への継続である場合、あなたはcould単に外側のループの上部にラベルを定義し、「goto」そのラベル。そうすることでコードの理解が妨げられないと感じた場合は、それが最も適切な解決策かもしれません。
ただし、これを機会として、制御フローが何らかのリファクタリングの恩恵を受けるかどうかを検討します。ネストされたループに条件付きの「break」と「continue」がある場合は常に、リファクタリングを検討します。
考慮してください:
successfulCandidate = null;
foreach(var candidate in candidates)
{
foreach(var criterion in criteria)
{
if (!candidate.Meets(criterion)) // Edited.
{ // TODO: no point in continuing checking criteria.
// TODO: Somehow "continue" outer loop to check next candidate
}
}
successfulCandidate = candidate;
break;
}
if (successfulCandidate != null) // do something
2つのリファクタリング手法:
まず、メソッドの内部ループを抽出します。
foreach(var candidate in candidates)
{
if (MeetsCriteria(candidate, criteria))
{
successfulCandidate = candidate;
break;
}
}
第二に、allループを削除できますか?何かを検索しようとしてループしている場合は、それをクエリにリファクタリングします。
var results = from candidate in candidates
where criteria.All(criterion=>candidate.Meets(criterion))
select candidate;
var successfulCandidate = results.FirstOrDefault();
if (successfulCandidate != null)
{
do something with the candidate
}
ループがない場合は、中断または続行する必要はありません!
while
{
// outer loop
while
{
// inner loop
try
{
throw;
}
catch
{
// how do I continue on the outer loop from here?
goto REPEAT;
}
}
// end of outer loop
REPEAT:
// some statement or ;
}
問題が解決しました。 (何??なぜあなたは私にその汚い外観を与えているのですか?)
ブレークを使用できます。ステートメント。
while
{
while
{
try
{
throw;
}
catch
{
break;
}
}
}
Continueは、現在のループの先頭に戻るために使用されます。
それよりも多くのレベルを分割する必要がある場合は、何らかの「if」を追加するか、恐ろしい/推奨されない「goto」を使用する必要があります。
Try/catch構造を内側のwhileループと交換します。
while {
try {
while {
throw;
}
}
catch {
continue;
}
}
番号。
内側のループを別のメソッドに抽出することをお勧めします。
while
{
// outer loop
try
{
myMethodWithWhileLoopThatThrowsException()
}
catch
{
// how do I continue on the outer loop from here?
continue;
}
}
}
内側のループでbreak
を使用します。
外側から続く内側から抜け出したいだけです。
while
{
// outer loop
while
{
// inner loop
try
{
throw;
}
catch
{
// how do I continue on the outer loop from here?
break;
}
}
}
using System;
namespace Examples
{
public class Continue : Exception { }
public class Break : Exception { }
public class NestedLoop
{
static public void ContinueOnParentLoopLevel()
{
while(true)
try {
// outer loop
while(true)
{
// inner loop
try
{
throw new Exception("Bali mu mamata");
}
catch (Exception)
{
// how do I continue on the outer loop from here?
throw new Continue();
}
}
} catch (Continue) {
continue;
}
}
}
}
}
これを達成する最良の方法は、breakステートメントを使用することだと思います。 Break 現在のループを終了するおよび終了した場所から実行を継続する。この場合、内側のループを終了するおよび外側のwhileループに戻るになります。コードは次のようになります。
while
{
// outer loop
while
{
// inner loop
try
{
throw;
}
catch
{
// break jumps to outer loop, ends inner loop immediately.
break; //THIS IS THE BREAK
}
}
}
それがあなたが成し遂げようとしていたことだと思います、正しいですか?ありがとう!