2011-01-05 114 views
0

如果我运行代码尝试捕捉恢复

try 
{ 
line one 
line 2 
line 3 
. 
. 
. 
. 
} 
catch(Exception x) 
{ 
} 

现在如果出现异常,在任何一行我不知道,我们在该行做抓一些东西,所以剂量不发生异常再现在我们需要的GoBack从发生异常的地方排队并执行同一行,我们如何做到这一点?

+0

我不明白这个问题。你能尝试以不同的方式解释吗? – 2011-01-05 18:30:20

+0

一个普通的老GOTO会做......开玩笑。你在代码中显示的方式很难。如果拆分了调用单个故障报表的方式@大卫Gelhar表演及将它们放在不同的功能,你可以重新运行在catch一个“失败”的功能,但如果在“我们做一些东西在追赶,这样的例外剂量不会发生“不起作用? – user44298 2011-01-05 19:04:38

回答

3

假设这是Java中,你不能做到这一点 - 一旦抛出异常,没有在try块的其余部分将被执行。你将不得不使用多个try/catch块来明确你想要做什么:

try { 
    line one 
} catch (Exception x) { 
    fixup line one 
} 

try { 
    line 2 
} catch (Exception x) { 
    fixup line 2 
} 

...等。

+0

但有多少尝试catchrerements?有没有其他方式 – 2011-01-05 18:37:19

+0

@Afnan是的。将try catch语句放在'do {} while();'循环中。将条件设置为false,则会在循环的开始,并且真正在任何catch块。 – 2011-01-06 01:51:38

0

这种失败的尝试捕捉的目的。如果你发现异常,你应该处理这个错误。如果你想继续你离开的地方,最好的方法可能是把代码放在finally块中。如果发生异常或者没有发生异常,此代码将始终运行。

try { 
    //some exception prone code 
} 
catch(Exception e) { 
    //handle exception 
} 
finally { 
    //Always runs after exception caught or if no exception thrown 
} 
+0

,如果你想继续你离开的地方通常是把可能它自己的try/catch块中失败的每个操作正确的成语;如果这会导致代码膨胀,人们可能会写它包装匿名方法在一个try/catch适合于手头的任务时尚“tryExec”的方法。 – supercat 2011-06-27 22:58:15

0

你不知道。如果你解决了这个问题,你应该再次运行整个模块。 try块的要点是它具有执行特定任务所需的所有内容。在这之后的任何事情都是不可能的。如果您需要清理打开文件描述符,则可以使用finally块;但你确实需要解决这个问题,然后再试一次,或者用一个好的错误信息去死。

0

你能坚持在try/catch块一个循环内,像这样:

bool done = NO; 

while (! done) { 
    try { 
     done = YES; 
    } catch { 

    } 
} 

这将导致整个块被重新执行。如果你想继续你离开的地方,那么你需要沿途跟踪你的状态:

bool  done = NO; 
int  state = 0; // setup some constants, kStateA = 0, kStateB = 1, etc: 

while (! done) { 
    try { 
     switch (state) { 
      case kStateA: line 1; ++state; // fall through 
      case kStateB: line 2; ++state; 
      // etc. 
     } 

     done = YES; 
    } catch { 

    } 
} 

上面的代码,简化为更符合你的问题行看起来是这样的(虽然状态机的概念仍然是基本原理):

bool done = NO; 
int  lineNumber = 1; 

while (! done) { 
    try { 
     switch (lineNumber) { 
      case 1: line 1; ++lineNumber; // fall through 
      case 2: line 2; ++lineNumber; // fall through 
      // etc. 
     } 

     done = YES; 
    } catch { 

    } 
}