2012-03-07 18 views
9

Napisałem następujący kod testowy, choć był pewien, co by się stało:Co dzieje się z zwracaną wartością po wyjściu wyjątku w bloku finally?

static void Main(string[] args) 
{ 
    Console.WriteLine(Test().ToString()); 
    Console.ReadKey(false); 
} 

static bool Test() 
{ 
    try 
    { 
     try 
     { 
      return true; 
     } 
     finally 
     { 
      throw new Exception(); 
     } 
    } 
    catch (Exception) 
    { 
     return false; 
    } 
} 

Rzeczywiście, program napisał „false” do konsoli. Moje pytanie brzmi: co dzieje się z prawdą, która została pierwotnie zwrócona? Czy istnieje sposób, aby uzyskać tę wartość, w bloku catch, jeśli to możliwe, lub w oryginale w końcu bloku, jeśli nie?

Aby wyjaśnić, służy to wyłącznie celom edukacyjnym. Nigdy nie zrobiłbym takiego zawiłego systemu wyjątków w rzeczywistym programie.

+0

Prawie duplikat: [Czy jest legalne i możliwe uzyskanie dostępu do wartości zwracanej w bloku finally?] (Http://stackoverflow.com/q/304847/256431) –

Odpowiedz

5

Nie, nie można uzyskać tej wartości, ponieważ w końcu zwracana jest tylko nazwa bool. Możesz jednak ustawić zmienną.

static bool Test() 
{ 
    bool returnValue; 

    try 
    { 
     try 
     { 
      return returnValue = true; 
     } 
     finally 
     { 
      throw new Exception(); 
     } 
    } 
    catch (Exception) 
    { 
     Console.WriteLine("In the catch block, got {0}", returnValue); 
     return false; 
    } 
} 

Jest jednak brudny. A dla celów edukacyjnych odpowiedź brzmi: nie.

+0

W porządku, dziękuję za odpowiedź. No cóż. – aboveyou00

+3

To jest rzeczywiście interesujące w VB.NET, gdzie wynik zmiennej lokalnej 'Test' jest wstępnie zdefiniowany dla ciebie. Właśnie to przetestowałem i jest to "True" w równoważnym bloku 'Catch', nawet jeśli w wewnętrznym bloku' Try' użyto tylko 'Return True'. I oczywiście funkcja zwraca "False". –

+2

@MarkHurd: To jest interesujące. Muszę to gdzieś użyć :) Hmm ... – Ryan

Powiązane problemy