最后的代码是在Objective-C中返回后运行的吗?

时间:2010-06-03 19:15:07

标签: objective-c exception try-catch-finally

请考虑以下代码:

@try {
  if (something.notvalid)
  {
    return;
  }
  // do something else
} @catch (NSException *ex) {
  // handle exception
} @finally {
  NSLog(@"finally!");
}

如果something无效且我在try中返回,@finally中的代码是否执行?我相信,除了我所说过的其他人不应该这么认为,我现在无法对此进行测试。

5 个答案:

答案 0 :(得分:15)

@finally代码始终根据herehere执行。

  

@finally块包含代码   必须执行是否异常   被抛出与否。

答案 1 :(得分:4)

是。奇怪的是,确实如此。我不知道为什么,但我只是建立了一个测试并尝试了许多配置,每次都这样做。

以下是配置:

  • 在try块中返回:停止执行try块并最终导致执行
  • 在try块中返回并最终返回:在finally块和整个方法中停止执行try并停止执行。
  • 在finally块中返回:在try / catch / finally块之外的正常返回中运行。

答案 2 :(得分:2)

使用RAI定义,无论如何,最终块将使用该代码范围执行,特别是资源。

它与对象的~Destructor有着密切的关系。与对象的~Destructor总是执行一样,最后块也会执行。

答案 3 :(得分:1)

是。即使Exception块中有catch,也会执行finally

如果您熟悉C ++,请将finally视为destructor的{​​{1}}。什么状态的对象object中的语句将被执行。 但你不能把~Destructor放在return [虽然有些编译器允许]。

请参阅以下代码:了解全局变量finally的更改方式。 另请参阅y Exception1如何涵盖Exception2

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace finallyTest
{
    class Program
    {
        static int y = 0;
        static int testFinally()
        {
            int x = 0;
            try
            {
                x = 1;
                throw new Exception("Exception1");
                x = 2;
                return x;
            }
            catch (Exception e)
            {
                x = -1;
                throw new Exception("Exception2", e);
            }
            finally
            {
                x = 3;
                y = 1;
            }
            return x;
        }

        static void Main(string[] args)
        {
            try
            {
                Console.WriteLine(">>>>>" + testFinally());
            }
            catch (Exception e)
            { Console.WriteLine(">>>>>" + e.ToString()); }
            Console.WriteLine(">>>>>" + y);
            Console.ReadLine();
        }
    }
}

输出:

    >>>>>System.Exception: Exception2 ---> System.Exception: Exception1
   at finallyTest.Program.testFinally() in \Projects\finallyTest\finallyTest\Program.cs:line 17
   --- End of inner exception stack trace ---
   at finallyTest.Program.testFinally() in \Projects\finallyTest\finallyTest\Program.cs:line 24
   at finallyTest.Program.Main(String[] args) in \Projects\finallyTest\finallyTest\Program.cs:line 38
>>>>>1

答案 4 :(得分:0)

是的,这是一个示例代码段,输出是

试试吧! 抓住! 最后!

@try {
    NSLog(@"try!");

    NSException *e = [NSException
                      exceptionWithName:@"No Name"
                      reason:@"No Reason"
                      userInfo:nil];
    @throw e;


} @ catch (...)
{
    NSLog(@"catch!");
    return;
}
@finally
{
    NSLog(@"finally!");
}

NSLog (@"other code");