2012-03-23 58 views
5

Tôi đã viết một chương trình đơn giản để kiểm tra lý thuyết rằng khối "cuối cùng" sẽ luôn luôn thực thi bất kể cái gì. Nhưng, những gì tôi nhìn thấy từ pgm dưới đây là điều khiển không bao giờ có vẻ nhập vào khối cuối cùng bên ngoài.Tại sao bên ngoài "cuối cùng" không được thực hiện khi bên trong "bắt" ném?

Tôi đã thử thực hiện F5 và cũng Ctrl-F5 trong Visual studio và kết quả tương tự.

Ai đó có thể giải thích lý do tại sao tôi thấy hành vi này?

Output trên cửa sổ giao diện điều khiển là:

bên trong bắt

bên cuối cùng

ngoài bắt

unhandled exeption:

..và sau đó ứng dụng bị treo

public class Program 
{ 
    static void Main() 
    { 
     try 
     { 
      try 
      { 
       string s = null; 
       s.ToString(); 
      } 
      catch 
      { 
       Console.WriteLine("inner catch"); 
       throw; 
      } 
      finally 
      { 
       Console.WriteLine("inner finally"); 
      } 

      return; 
     } 
     catch 
     { 
      Console.WriteLine("outer catch"); 
      throw; 
     } 
     finally 
     { 
      Console.WriteLine("outer finally"); 
     } 
    } 
} 

Trả lời

7

"Cuối cùng bên ngoài" được chạy, ngay sau khi ngoại lệ được xử lý.

Đây là kết quả từ chạy mã này bên ngoài của debugger:

 
inner catch 
inner finally 
outer catch 

Unhandled Exception: System.NullReferenceException: Object reference not set to 
an instance of an object. 
    at SOConsole.Program.Main() in c:\Users\DaveShaw\Documents\Visual Studio 11\Pro 
jects\SO\SOConsole\Program.cs:line 35 
outer finally 
Press any key to continue . . . 

Khi ngoại lệ xảy ra những điều sau đây được hiển thị: Exception

Sau khi tôi nhấp vào "Hủy bỏ", ứng dụng khôi phục và hiển thị "bên ngoài cuối cùng".

Nếu vì lý do nào đó bạn đóng ứng dụng của mình trước khi có cơ hội nhập "cuối cùng bên ngoài" thì bạn sẽ không bao giờ thấy thông báo của bạn. Nếu quá trình của ứng dụng bị "chấm dứt" thì cuối cùng sẽ bị bỏ qua trong trường hợp chúng chứa mã ngăn ứng dụng đóng lại. Nếu không, nó có thể không thể chấm dứt quá trình đó.

+0

oh ok. nhấp vào hủy bỏ làm cho "bên ngoài cuối cùng: tuyên bố hiển thị. Tốt để biết điều này. – user330612

4

Ứng dụng có khả năng chấm dứt trước khi bộ đệm xuất chuẩn bị xóa.

Hoặc thêm điểm ngắt vào cuối cùng bên ngoài (trên WriteLine) hoặc ném ngoại lệ khác nhau từ bên ngoài cuối cùng để xác nhận. A finallykhông bị bỏ qua: làm như vậy sẽ là một lỗi nghiêm trọng!

+1

+1 hoặc thực hiện khóa đọc ở cuối. – Craig

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