15

次のコードを検討してください。

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

somethingが無効で、try 内から戻った場合、コードは実行され@finallyますか? 私はそうすべきだと信じていますが、私が話した他の人はそうは考えておらず、現時点でこれをテストすることはできません.

4

5 に答える 5

15

@finally コードは常にhereおよびhereに従って実行されます。

@finally ブロックには、例外がスローされるかどうかにかかわらず実行する必要があるコードが含まれています。

于 2010-06-03T19:30:46.713 に答える
4

はい。奇妙なことに、そうです。理由はわかりませんが、テストを作成し、多くの構成を試しましたが、毎回そうでした。

構成は次のとおりです。

  • try ブロックで戻る: try ブロックの実行を停止し、最終的に実行されるようにしました
  • try ブロックで戻り、finally で戻ります: try の実行を停止し、finally ブロックとメソッド全体で実行を停止しました。
  • finally ブロックで戻る: try/catch/finally ブロックの外で通常の戻りのように機能します。
于 2010-06-03T19:32:42.490 に答える
2

RAI 定義では、Finally ブロックは、特定のリソースに対して、そのコード スコープでとにかく実行されます。

Objectの と近い意味~Destructorです。オブジェクトが~Destructor常に実行されるのと同じように、finally ブロックも実行されます。

于 2013-04-04T08:41:21.283 に答える
1

はい。ブロックException内があったとしても、実行されます。catchfinally

C++ に精通している場合は、のと考えfinallyてください。オブジェクト内のステートメントの状態が何であれ、実行されます。ただし、 [一部のコンパイラでは許可されています]内に入れることはできません。destructorobject~Destructorreturnfinally

以下のコードを参照してください: グローバル変数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
于 2013-03-06T09:19:18.343 に答える