2009-02-24 18 views

Trả lời

25

Giả sử quy trình không chấm dứt đột ngột (hoặc treo, tất nhiên), khối cuối cùng sẽ luôn được thực thi.

Nếu không có khối cuối cùng, ngoại lệ từ khối catch sẽ chỉ được ném lên ngăn xếp. Lưu ý rằng ngoại lệ ban đầu khiến khối catch được thực thi ngay từ đầu sẽ bị mất hiệu quả.

stack overflow ngoại lệ

Như Jared lưu ý, một chồng tràn sẽ gây ra các khối finally không được thực thi. Tôi tin rằng điều này chấm dứt chương trình đột ngột, nhưng tôi có thể sai. Dưới đây là mẫu mã:

using System; 

public class Test 
{  
    static void Main() 
    { 
     // Give the stack something to munch on 
     int x = 10; 
     try 
     { 
      Main(); 
      Console.WriteLine(x); 
     } 
     finally 
     { 
      Console.WriteLine("Finally"); 
     } 
    } 
} 

Kết quả:

Process bị chấm dứt do StackOverflowException.

+2

Tôi cho rằng ngoại lệ tràn ngăn chặn thực sự cũng có thể ngăn không cho chạy cuối cùng. Tôi không thể tìm thấy tài liệu cho bàn tay này mặc dù. – JaredPar

+1

@Jared: Vâng, tôi nghĩ bạn hoàn toàn đúng. OutOfMemoryException là tốt? Không chắc chắn về điều đó. Sẽ cố gắng tái sản xuất. –

+1

Nhưng liệu StackOverflowException có chấm dứt toàn bộ quá trình không? Nếu vậy, nó đến dưới kiểm tra đầu tiên của tôi. –

6

Khối cuối cùng sẽ luôn được thực thi. Nếu bạn loại bỏ khối cuối cùng, và một ngoại lệ xảy ra bên trong khối catch, thì không có mã nào sau khối catch sẽ thực thi, bởi vì về cơ bản khối catch của bạn sẽ thất bại và tạo ra một ngoại lệ chưa được giải quyết.

6

Có kết quả cuối cùng sẽ luôn được chạy

Không có mã nào sau khi khối catch sẽ không chạy.

Ngay cả khi cuối cùng chặn bất kỳ mã nào theo sau khối cuối cùng sẽ không chạy.

+1

+1 cho mã sau khi cuối cùng không chạy –

4

Nếu có ngoại lệ trong khối catch, cuối cùng sẽ thực thi, nhưng một ngoại lệ mới sẽ được ném. Khối catch trong đó ngoại lệ xảy ra sẽ không bắt được ngoại lệ, nó sẽ tiếp tục lên stack.

Bài học kinh nghiệm: không làm các công cụ trong khối đánh bắt có thể ném nếu bạn có thể giúp; nếu bạn phải, hãy lồng một khối try/catch.

try 
{ 

} 
catch() 
{ 
    try 
    { 
    // code fails here 
    } 
    catch 
    { 
    // handle that. Or not. 
    } 
} 
finally 
{ 

} 
0

Nếu ngoại lệ xảy ra trong khối catch, tất cả mã cuối cùng vẫn sẽ được thực thi. Nếu có trình xử lý ngoại lệ cao hơn trong ngăn xếp (ví dụ: người gọi hàm này), nó sẽ bắt ngoại lệ này. Khác dẫn đến một ngoại lệ unhandled và đưa ứng dụng của bạn xuống.

Mã sau điểm ngoại lệ trong khối catch sẽ không được gọi.

1

Khối cuối cùng sẽ luôn được thực thi.Từ MSDN:

Khối cuối cùng hữu ích để dọn sạch mọi tài nguyên được phân bổ trong khối thử cũng như chạy bất kỳ mã nào phải thực thi ngay cả khi có ngoại lệ. Kiểm soát luôn được chuyển đến khối cuối cùng bất kể khối try out thoát ra như thế nào.

Trong khi bắt được sử dụng để xử lý các ngoại lệ xảy ra trong khối lệnh, cuối cùng được sử dụng để đảm bảo khối mã lệnh thực hiện bất kể khối thử trước đó bị thoát ra sao.

Bằng cách này, đây là loại câu hỏi mà bạn có thể dễ dàng kiểm tra bản thân bằng cách viết một số mã, biên dịch và xem điều gì xảy ra khi bạn thực thi nó.

class Program { 
    static void Main(string[] args) { 
     try { 
      Console.WriteLine("Trying!"); 
      throw new Exception(); 
     } 
     catch (Exception e) { 
      Console.WriteLine("Catching {0}!", e.Message); 
      throw new Exception(); 
     } 
     finally { 
      Console.WriteLine("Finally!"); 
     } 
    } 
} 

đầu ra này:

Trying!
Catching Exception of type 'System.Exception' was thrown.!

Unhandled Exception: System.Exception: Exception of type 'System.Exception' was
thrown.
at TestFinally.Program.Main(String[] args) in C:\Documents and Settings\Me\My
Documents\Visual Studio 2008\Projects\TestFinally\TestFinally\Program.cs:line 15
Finally!
Press any key to continue . . .

0

Chỉ muốn thêm các trường hợp Tôi biết về điều đó sẽ không cho phép cuối cùng và bất kỳ khối mã khác thực hiện:

  • Trong trường hợp của một hệ thống StackOverflowException
  • runtime-ném. Environment.FastFail
  • Environment.Exit
  • Nếu chuỗi "nền" bị chấm dứt vì chương trình chính là mà nó thuộc về kết thúc.
  • Tắt bất ngờ :)
Các vấn đề liên quan