Код в конце концов запускается после возврата в Objective-C? - PullRequest
15 голосов
/ 03 июня 2010

Рассмотрим следующий код:

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

Если something недействительно и я возвращаюсь из попытки, выполняется ли код в @finally или нет? Я верю, что так и должно быть, но другие, о которых я говорил, так не думают, и сейчас я не могу это проверить.

Ответы [ 5 ]

15 голосов
/ 03 июня 2010

@ наконец код всегда выполняется в соответствии с здесь и здесь .

Блок @finally содержит код, который должно быть выполнено ли исключение брошен или нет.

4 голосов
/ 03 июня 2010

Да. Как ни странно, это так. Я не уверен, почему, но я только что построил тест и попробовал несколько конфигураций, и каждый раз это делал.

Вот конфиги:

  • Возврат в блоке try: остановил выполнение блока try и вызвал окончательное выполнение
  • Возврат в блок try и возврат в finally: остановлено выполнение try и остановлено выполнение в блок finally и весь метод.
  • Возврат в блоке finally: функционирует как обычный возврат вне блока try / catch / finally.
2 голосов
/ 04 апреля 2013

С определением RAI, в конце концов, блок Наконец будет выполняться с этой областью кода для конкретного ресурса.

Имеет близкое значение с ~Destructor объекта. Так же, как объект ~Destructor всегда выполняется, блок finally также выполняется.

1 голос
/ 06 марта 2013

Да. Даже если в блоке catch было Exception, finally будет выполнено.

Если вы знакомы с C ++, просто подумайте finally как destructor из 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
0 голосов
/ 04 апреля 2018

Да, вот пример кода, вывод

попробовать! ловить! наконец!

@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");
...