在这段代码示例中,有没有办法从catch块继续外循环?
while
{
// outer loop
while
{
// inner loop
try
{
throw;
}
catch
{
// how do I continue on the outer loop from here?
continue;
}
}
}
答案 0 :(得分:97)
更新:这个问题是my article on this subject.的灵感来自这个好问题!
“继续”和“休息”只不过是一个“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
两种重构技术:
首先,将内循环提取到方法:
foreach(var candidate in candidates)
{
if (MeetsCriteria(candidate, criteria))
{
successfulCandidate = candidate;
break;
}
}
其次,所有循环可以消除吗?如果您正在尝试搜索某些内容而进行循环,则将其重构为查询。
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
}
如果没有循环,则无需中断或继续!
答案 1 :(得分:29)
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 ;
}
问题解决了。 (什么?为什么你们都给我这么脏的样子?)
答案 2 :(得分:18)
你可以休息一下;言。
while
{
while
{
try
{
throw;
}
catch
{
break;
}
}
}
继续用于跳回当前循环的顶部。
如果您需要打破更多级别,您将需要添加某种“if”或使用可怕的/不推荐的“goto”。
答案 3 :(得分:10)
使用内部while循环交换try / catch结构:
while {
try {
while {
throw;
}
}
catch {
continue;
}
}
答案 4 :(得分:4)
没有。
我建议,将内循环解压缩为单独的方法。
while
{
// outer loop
try
{
myMethodWithWhileLoopThatThrowsException()
}
catch
{
// how do I continue on the outer loop from here?
continue;
}
}
}
答案 5 :(得分:3)
在内循环中使用break
。
答案 6 :(得分:1)
你只想打破继续外在的内心。
while
{
// outer loop
while
{
// inner loop
try
{
throw;
}
catch
{
// how do I continue on the outer loop from here?
break;
}
}
}
答案 7 :(得分:0)
我认为实现这一目标的最佳方法是使用 break 语句。中断结束当前循环,从结束时继续执行。在这种情况下,结束内循环,跳回外循环。这就是您的代码的样子:
while
{
// outer loop
while
{
// inner loop
try
{
throw;
}
catch
{
// break jumps to outer loop, ends inner loop immediately.
break; //THIS IS THE BREAK
}
}
}
我相信这是你想要完成的,对吗? 谢谢!
答案 8 :(得分:0)
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;
}
}
}
}
}
答案 9 :(得分:-2)
使用自己的异常类型,例如MyException。然后:
while
{
try {
// outer loop
while
{
// inner loop
try
{
throw;
}
catch
{
// how do I continue on the outer loop from here?
throw MyException;
}
}
} catch(MyException)
{ ; }
}
这将用于继续和突破几个级别的嵌套while语句。 抱歉格式不正确;)