2012-03-07 29 views
9

tôi viết mã kiểm tra sau, mặc dù tôi là khá chắc chắn điều gì sẽ xảy ra:Điều gì xảy ra với giá trị trả về sau khi ngoại lệ được ném vào khối cuối cùng?

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

đủ Chắc chắn, chương trình đã viết "False" ra cửa sổ Console. Câu hỏi của tôi là, điều gì xảy ra với sự thật mà ban đầu được trả về? Có cách nào để có được giá trị này, trong khối catch nếu có thể, hoặc trong bản gốc cuối cùng bị chặn nếu không?

Chỉ cần làm rõ, điều này chỉ dành cho mục đích giáo dục. Tôi sẽ không bao giờ làm một hệ thống ngoại lệ phức tạp như vậy trong một chương trình thực tế.

+0

Hầu như trùng lặp: [Có hợp pháp và có thể truy cập giá trị trả lại trong một khối cuối cùng không?] (Http://stackoverflow.com/q/304847/256431) –

Trả lời

5

Không, bạn không thể nhận được giá trị đó, vì sau cùng, chỉ trả lại bool. Tuy nhiên, bạn có thể đặt biến.

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

Thật là lộn xộn. Và cho mục đích giáo dục, câu trả lời là không.

+0

Được rồi, cảm ơn câu trả lời. Oh well. – aboveyou00

+3

Điều này thực sự thú vị trong VB.NET, nơi kết quả trả về biến cục bộ 'Test' được xác định trước cho bạn. Tôi vừa thử nghiệm nó và nó là 'True' trong khối' Catch' tương đương, ngay cả khi chỉ 'Return True' được sử dụng trong khối' Try' bên trong. Và, tất nhiên, 'False' được trả về bởi hàm. –

+2

@MarkHurd: Điều đó thật thú vị. Tôi cần phải sử dụng một nơi nào đó :) Hmm ... – Ryan

Các vấn đề liên quan