2012-06-14 29 views
19

Tại sao không phải là dòng "Console.WriteLine (" asdf ");" Thực thi? Tất cả những người khác là. Không phải nó cũng như chúng ta không thể nhảy ra khỏi phạm vi cuối cùng sao?Cố gắng lồng nhau cuối cùng trong C#

static bool Func() 
{ 
    try 
    { 
     try 
     { 
     } 
     finally 
     { 
      try 
      { 
       throw new ApplicationException(); 
      } 
      finally 
      { 
       Console.WriteLine("asd"); 
      } 

      Console.WriteLine("asdf"); 
     } 
    } 
    finally 
    { 
     Console.WriteLine("asd"); 
    } 
} 
+3

Liên quan: [Điều gì xảy ra trong C# Nếu một khối cuối cùng ném một ngoại lệ?] (Http://stackoverflow.com/questions/2911215) –

Trả lời

25

Cuối cùng khối chỉ bảo lãnh (ít nhất chủ yếu là đảm bảo, thấy ngoại trừ từ MSDN dưới đây) rằng họ sẽ có vào trong trường hợp các khối try ném một ngoại lệ. Nếu bạn ném một ngoại lệ trong vòng khối cuối cùng, ngoại lệ sẽ khiến kiểm soát rời khỏi khối cuối cùng và phần còn lại của mã trong khối cuối cùng đó sẽ không thực thi.

Trong trường hợp của bạn, dòng không được thực hiện xảy ra sau khi ngoại lệ trong cùng một khối cuối cùng, do đó, nó bị bỏ qua.

Từ MSDN - try-finally:

Các cuối cùng khối rất hữu ích để dọn dẹp bất kỳ tài nguyên mà bố trí trong thử khối và để chạy bất kỳ mã đó phải thực hiện thậm chí nếu một ngoại lệ xảy ra trong số thử khối. Thông thường, báo cáo của một khối cuối cùng được thực hiện khi kiểm soát lại một thử tuyên bố, cho dù việc chuyển giao quyền kiểm soát xảy ra như là kết quả của thực hiện bình thường, thực hiện của một nghỉ, tiếp tục, goto hoặc trả lại tuyên bố hoặc tuyên truyền ngoại lệ ra khỏi tuyên bố dùng thử.

Trong trường hợp ngoại lệ được xử lý, liên kết cuối cùng là khối được đảm bảo để chạy. Tuy nhiên, nếu ngoại lệ không được giải quyết, việc thực thi các khối cuối cùng là phụ thuộc vào cách hoạt động ngoại lệ được giải phóng là được kích hoạt. Điều đó, đến lượt nó, phụ thuộc vào cách máy tính của bạn được thiết lập. Để biết thêm thông tin, hãy xem Xử lý ngoại lệ không được xử lý trong CLR.

Lưu ý: Unhandled Exception Processing in the CLR là tham chiếu đến bài viết trong số tháng 9 năm 2008 của tạp chí MSDN. Tất cả các vấn đề năm 2008 và cũ hơn của tạp chí MSDN chỉ có sẵn dưới dạng tệp .chm và sẽ cần được tải xuống trước khi xem.

+0

'" Cuối cùng, khối chỉ đảm bảo * snip * rằng chúng sẽ được nhập nếu thử khối ném một ngoại lệ "' bạn có nghĩa là cuối cùng khối chỉ nhập sau khi thoát khỏi một khối thử? (bắt khối thực hiện trên một ngoại lệ) –

+1

Đó là sự thật. Tôi đã cố gắng chỉ ra cách họ xử lý các trường hợp ngoại lệ, và thực tế là họ không đảm bảo rằng họ sẽ được chạy trong toàn bộ của họ, nhưng họ sẽ ít nhất được nhập vào. –

+0

Xem bài viết [Tạp chí MSDN 2008 tháng 9: Xử lý ngoại lệ không được xử lý trong CLR] (http://download.microsoft.com/download/3/a/7/3a7fa450-1f33-41f7-9e6d-3aa95b5a6aea/MSDNMagazine2008_09en-us.chm). (để mở chm nó cần phải mở khóa: File Properties -> General -> Unlock) – vladimir77

4

Trường hợp ngoại lệ được ném trong khối cuối cùng (hoặc bắt) hủy phần còn lại của khối cuối cùng (hoặc bắt).

5

Vì ngoại lệ được ném vào khối cuối cùng đó, do đó, nó khiến kiểm soát rơi vào khối cuối cùng cuối cùng. Vì vậy, "asdf" WriteLine không bao giờ thực thi.

3

Lỗi xảy ra bên trong khối thử thứ 3 gây ra lỗi tương ứng cuối cùng sẽ được thực thi. Tuy nhiên, điều này khiến cho nó bị lỗi trong dòng cuối cùng và bị chặn bởi khối thử cuối cùng ban đầu.

1

bởi vì bạn phải ném vào khối try và nó sẽ thực hiện khối finally với Console.WriteLine("asd"); và thoát để bên ngoài cố gắng nắm bắt

16

Tôi nghĩ rằng cách tốt nhất điều này có thể được trả lời là bằng cách sử dụng mã và do đó hình ảnh sau enter image description here

+4

+ 1 cho hình ảnh tuyệt vời ... cho một ngàn chữ. –

+0

Tôi nghĩ rằng nó bị chặn bởi khối thử nghiệm bên ngoài, cuối cùng cũng không bắt được gì cả. –

0

Khi tôi sử dụng các khối thử cuối cùng trên mã được triển khai trên các máy chủ lưu trữ khác nhau, tôi thấy rằng: khi không có ngoại lệ nào được ném vào khối thử.

một số nền tảng Windows luôn thực hiện khối cuối cùng và một số nền tảng không bao giờ thực thi khối cuối cùng.

Cuối cùng khối của tôi chứa hướng dẫn để đóng nhật ký lỗi và không thực hiện khối cuối cùng luôn đưa ra một ngoại lệ khác khi thoát chỉ để lại thông tin mật mã có sẵn để tìm ra nguyên nhân gây ra lỗi. Đối với ứng dụng của tôi, thử các khối cuối cùng gặp nhiều rắc rối hơn chúng đáng giá.

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