2010-04-09 73 views
0

我该怎么做?试试看 - 最后在If语句中,如何继续?

void x() 
    {.... 
     if (...) 
     {try 
      {} 
      catch (ComException com) 
       { throw com} 
      finally // in any case, executed fine! 
       {...instructions.......} 

     } 
     ... instructions...// not executed in case of exception because the finally can't embrace the following code too... but this block of code needs to be executed in any case too... 
     {} 


    } 
+0

你为什么要在catch块中抛出异常? – 2010-04-09 21:21:33

+0

@Matthew Jones 我猜OP正在省略catch块内的一些日志代码。否则是的,抓住并重新抛出是没有意义的。 – 2010-04-09 21:33:34

+0

,因为我必须捕捉一个特殊的异常,Com一个,然后把它扔到调用方法,也许语法可以减轻...(IM在C#)...但没有没有其他代码在赶上但抛出....否则你会怎么写它? – KitAndKat 2010-04-09 21:34:00

回答

1

将“else”分支中的代码移至单独的方法。然后从“else”和“finally”中调用该方法。

+0

这是唯一要做的事情。但现在我了解到,当你需要做的事情真的很牵强时,这可能是由于你的代码的功能和概念模型的一些弱点......所以对我感到羞耻! – KitAndKat 2010-04-13 22:26:32

3

这是不正确的逻辑。如果代码进入if语句,else块将不会被执行。

如果您确实需要在异常情况下执行它,请将else块中的代码复制到finally块中。

编辑:所以我觉得你想要的是这样的:

try 
{ 
    if() 
    { 
      try 
      { 
       //Code 
      } 
      catch(ComException e) 
      { 
       throw e; 
      } 
    } 
} 
finally 
{ 
    /*....instructions.....*/ 
} 

这背后的原因是,如果IF语句是真内尝试将执行代码,将赶上并重新抛出ComException如果遇到它。无论IF语句还是捕获ComException,finally块中的代码都会执行。

这是否更好地解释位置?

道歉dtb;他首先回答了这个问题,我只是补充了一个解释。

+0

是的,我完全对不起,其他错了,我编辑了我的代码,还有其他人,我很抱歉... – KitAndKat 2010-04-09 21:20:36

0

如果需要执行某些操作,它必须放在finally块中。最后总是执行,不管try和catch块发生了什么。 “else”的上下文确实在try/catch/finally段之外。

2

你在找吗?

try 
{ 
    if (...) 
    { 
     try 
     { 
      ... 
     } 
     catch (ComException) 
     { 
      ... 
     } 
    } 
} 
finally 
{ 
    ... 
} 

无论条件是否成立,都会执行finally块。

+0

在这个解决方案中的问题是我不能针对具体的指令与我的尝试,但我不得不拥抱大量的指令,而我想要一个特定的指令被捕获的调用方法... – KitAndKat 2010-04-09 21:29:03

+0

@ user313176:答案更新。那这个呢? – dtb 2010-04-09 21:31:48