反復のいずれかで例外が発生した場合でも、すべての反復を完了する for ループが必要です。
7 に答える
for (...)
{
try
{
// Do stuff
}
catch (Exception ex)
{
// Handle (or ignore) the exception
}
}
各反復を try..catch 内に入れるだけです
foreach(Person a in people)
{
try
{
WorkOnPerson(a);
}
catch
{
// do something if you want to.
}
}
または、これがプログラムで繰り返されるパターンであり、この catch all exception style のリスクを冒している場合は、コレクションの拡張としてラップします。前の例に適用すると、次のようになります。
people.ForEachIgnorant(ofThrowingWorkOnPerson);
または:
people.ForEachIgnorant(p => WorkOnPersonThatThrows(p));
実装:
public static void IgnorantForEach<T>(this IEnumerable<T> source, Action<T> action)
{
foreach (var item in source)
{
try
{
action(item);
}
catch { }
}
}
つまり、ソリューションにはforループと、ある種のエラー/例外処理プロセスを含める必要があるため、forループにtrycatchステートメントを埋め込む必要があります。
例外がスローされた場合、例外がスローされなかった場合のように、その1回の反復を完了する方法はありません。ただし、try catchを使用することで、例外をスローしないすべての反復をループで確実に実行できます。
forループに例外処理を埋め込む方法についてサポートが必要な場合は、teedyayによって投稿された例を使用してください。
一般的なリストを使用している場合は、次を使用してコレクションを反復処理できることにも注意する価値があると思います。
ForEach(アクション アクション)
http://msdn.microsoft.com/en-us/library/bwabdf9z.aspx
EmployeesList.ForEach(ProcessEmployee);
void ProcessEmployee(Employee employeeItem)
{
try
{
...
}
catch { }
}
これには、ループ内のコードを再利用可能にするという利点があります。
例外とは何か、何が原因か知っていますか? それをテストして、スローされるのを防ぐことができますか。CanCompleteStep または TryCompleteStep。完了できない場合は、そのステップをスキップしてください。その後、例外処理をループの外に置くことができます。
それを行うためのループ内の組み込み機能はありません。これは、例外を自動的に処理してループを続行するC#に組み込まれた言語機能ではありません。
また、可能な限り、ループ内にtry-catchブロックを配置しないでください。あなたが言及した問題は解決しますが、コンパイラとランタイムはそれだけの追加の仕事をしなければならないことを考慮してください。例外が発生していなければ、それはすべて無駄になります。
代わりに、例外を例外とします。これは例外的に発生することです。設計された入力の考慮事項の範囲外です。もちろん、これは単なる提案です。本当にループを続行する必要がある場合は、上記の2つのオプションを選択してください。