2010-06-03 15 views
15

Aşağıdaki kodu göz önünde bulundurun:Sonunda kod, Objective-C'de bir dönüşten sonra çalıştırılıyor mu?

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

something geçerli değilse ve denemenin içinden dönersem, @finally'daki kod yürütülür mü değil mi? Bunu yapmamam gerektiğine inanıyorum ama bunu düşünmüyorum ve şu anda bunu test edemiyorum.

cevap

14

@finally kodu her zaman here ve here göre yürütür.

bir @finally bloğu bir istisna atılır olup olmadığını yürütülmelidir kodu içerir.

4

Evet. İşin tuhafı, öyle. Neden olduğundan emin değilim, ama bir test yaptım ve bir dizi konfigürasyon denedim ve her defasında yaptım. Try bloğunda

  • Dönüş: Burada

    yapılandırmaları vardı try'ın yürütülmesini durdurdu ve try bloğundaki nihayet yürütülecek
  • Return sebep oldu ve dönmek nihayet: denemede yürütmesini durdurdu ve yürütmeyi durdurdu Sonunda blok ve tüm yöntem. Nihayet blokta
  • Dönüş:/nihayet engellemek bir try/catch dışındaki normal bir dönüş gibi görev yaptı.
+2

İlk durum garip değil. İşte bu nihayetinde. Http://stackoverflow.com/questions/65035/in-java-does-return-trump-finally sayfasına bakın. – kennytm

+0

Görüyorsunuz, 'return'' try/catch/finally' bloğunun kapsamının ötesine geçip yönteme başvurabilirim. Bunu yapmanın yanlış olduğunu söylemiyorum, ama beni koruyarak yakaladı. Sadece hiç dikkat etmediğim bir şey. Sanırım her zaman yöntemlerimi sonuna kadar taşıdım;) – lewiguez

1

Evet. catch bloğunda bir Exception olsa bile, finally yürütülür. Eğer C++ aşina değilseniz

, sadece bir object ait destructor olarak finally düşünüyorum. Nesne içinde bir ifade durumu ne olursa olsun, ~Destructor yürütülür. Ancak finally numaralı telefona return'u ekleyemezsiniz [bazı derleyiciler izin versin].

aşağıdaki kodu bakınız: değiştirilmiştir nasıl küresel değişkeni y bakınız. Ayrıca bkz. Exception1, Exception2 tarafından karşılanmıştır.

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(); 
     } 
    } 
} 

çıkışı: RAİ tanımı ile

>>>>>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 
2

Son olarak, blok zaten belirli bir kaynak için bu kod kapsamı ile çalıştırılcak.

O Nesne en ~Destructor ile yakın bir anlamı vardır. Nesnenin ~Destructor her zaman olduğu gibi her zaman çalışır, son olarak da blok yürütür.

İlgili konular