2009-07-06 40 views
9

Tôi có một tình huống mà tôi muốn mã nhất định được thực hiện bất kể điều gì xảy ra, nhưng tôi cần ngoại lệ cũng được chuyển lên ngăn xếp để xử lý sau này. Có những điều sau đây: Không thử/cuối cùng bỏ qua ngoại lệ?


try 
{ 
    // code 
} 
finally 
{ 
    // code that must run 
} 

sẽ bỏ qua bất kỳ ngoại lệ nào hoặc nó sẽ vượt qua chúng? Thử nghiệm của tôi dường như cho thấy rằng họ vẫn được thông qua trên, nhưng tôi muốn chắc chắn rằng tôi không điên.

EDIT: Câu hỏi của tôi không phải là về thời gian và nếu cuối cùng sẽ thực thi, đó là về việc liệu ngoại lệ vẫn bị ném lên trên, nhưng điều đó đã được trả lời ngay bây giờ.

+0

Điều này khá gần với http://stackoverflow.com/questions/547791/why-use-finally-in-c –

+2

Ngôn ngữ/nền tảng nào? Java hoặc C#? –

+1

Có một wtf khá tốt hàng ngày về điều này: http://thedailywtf.com/Articles/My-Tales.aspx –

Trả lời

7

Đây là một lớp thử nghiệm cho thấy rằng (1) cuối cùng chạy, bất kể ngoại lệ được ném; và (2) ngoại lệ được chuyển cho người gọi.

public class FinallyTest extends TestCase { 
    private boolean finallyWasRun = false; 

    public void testFinallyRunsInNormalCase() throws Exception { 
     assertFalse(finallyWasRun); 
     f(false); 
     assertTrue(finallyWasRun); 
    } 

    public void testFinallyRunsAndForwardsException() throws Exception { 
     assertFalse(finallyWasRun); 
     try { 
      f(true); 
      fail("expected an exception"); 
     } catch (Exception e) { 
      assertTrue(finallyWasRun); 
     } 
    } 

    private void f(boolean withException) throws Exception { 
     try { 
      if (withException) 
       throw new Exception(""); 
     } finally { 
      finallyWasRun = true; 
     } 
    } 
} 
16

finally sẽ luôn chạy và các ngoại lệ sẽ được chuyển lên khi bạn nói. Đó là khá nhiều điểm của try/finally - để có một số mã sẽ luôn chạy, ngay cả khi ngoại lệ được ném.

Chỉnh sửa: Điều này đúng với bất kỳ ngôn ngữ nào cung cấp cấu trúc try/finally, nhưng hãy cẩn thận với một số ngôn ngữ, như Adam nêu trong nhận xét của anh ấy và Sam chỉ ra câu trả lời của anh ấy.

+0

điều này là không thực sự đúng, xem câu trả lời liên quan –

+0

Tôi tin rằng Richie là chính xác; trong một thử/cuối cùng, mã bên trong khối thử được thực hiện, và bất kể một ngoại lệ có được ném hay không, mã trong khối cuối cùng được thực thi sau đó. – snake

+0

@ snake, xem câu trả lời của tôi và các câu trả lời liên quan, có một số trường hợp cạnh mà cuối cùng trong C# sẽ không được thực hiện. –

3

Giả sử đây là C#, cuối cùng sẽ luôn luôn chạy, trừ khi bạn có được một StackOverflowException hoặc một ExecutingEngineException

Bên cạnh đó, trường hợp ngoại lệ không đồng bộ như ThreadAbortException thể làm gián đoạn dòng chảy của một khối finally gây ra nó để thực hiện một phần.

câu hỏi liên quan Xem:

In C# will the Finally block be executed in a try, catch, finally if an unhandled exception is thrown?

2

Nếu đây là C#:

Những câu trả lời ở đây là đúng, cuối cùng là chạy và các ngoại lệ được "thông qua lên". Nhưng để minh họa cách dễ dàng là để con nó ra:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     try 
     { 
      throw new Exception("testing"); 
     } 
     finally 
     { 
      Console.WriteLine("Finally"); 
     } 
    } 
} 

Khi chạy đơn giản, ít ứng dụng giao diện điều khiển này, ngoại lệ được ném ra và sau đó khối cuối cùng được thực hiện.

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