【问题标题】:Try Catch - Finally in If statement, how to go on after?Try Catch - finally 在 If 语句中,之后如何进行?
【发布时间】:2010-04-09 20:55:32
【问题描述】:

我该怎么做?

 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...
        {}


     }

【问题讨论】:

  • 为什么要在 catch 块中抛出异常?
  • @Matthew Jones 我猜 OP 在 catch 块中省略了一些日志记录代码。否则是的,捕捉和重新抛出是没有意义的。
  • 因为我必须捕获一个特殊的异常,即 Com 异常,然后将其扔给调用方法,也许语法可以减轻......(我在 c# 中)......但没有catch 中除了 throw 没有其他代码。否则你会怎么写?
  • @Anna:捕获异常而不是再次抛出异常有什么意义?仍然可能引发其他异常,因为您没有捕获它们(您必须添加 catch (Exception ex) 作为最后一个 catch 才能这样做)。当重新抛出异常时使用throw;,而不是throw ex;。这使调用堆栈和行号保持不变。
  • 关键是我需要抛出这个异常,但我需要 finally 才能继续代码。那么我应该如何在语法上使用 finally 而不使用 catch 呢?

标签: c# if-statement try-catch try-catch-finally


【解决方案1】:

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

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

编辑:所以我认为你想要的是这样的:

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

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

这是否更好地解释了这个位置?

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

【讨论】:

  • 是的,非常抱歉,其他错误,我编辑了我的代码,没有其他,对不起...
【解决方案2】:

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

【讨论】:

  • 这是唯一要做的事情。但现在我了解到,当你需要做一些非常牵强的事情时,这可能是由于你的代码的功能和概念模型中的一些弱点......真让我感到羞耻!
【解决方案3】:

你在找这个吗?

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

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

【讨论】:

  • 这个解决方案中的问题是我的尝试无法针对特定指令,但我必须接受很多指令,而我希望在调用方法中捕获特定指令......
【解决方案4】:

如果需要执行某些东西,它必须进入 finally 块。无论 try 和 catch 块中发生什么,finally 总是执行。 "else" 的上下文确实在您的 try/catch/finally 段之外。

【讨论】:

    最近更新 更多