2011-08-26 29 views
12

Có phải là một trong những rủi ro này không? Là một tốt hơn? Hay đó là một trong những thứ bạn in ra và ném phi tiêu vào để quyết định?Quay trở lại thử và bắt so với trả lại cuối cùng?

Tôi muốn làm điều này bây giờ mà tôi hiểu được cách làm việc cuối cùng:

try { 
    stuff that changes something... 
} 
catch (System.Exception ex) { 
    something.worked = false; 
    something.err = ex.Message; 
} 
finally { 
    stuff.close(); 
    return something; 
} 

Nhưng tôi đã nhìn thấy:

try { 
    stuff that changes something... 
    return something; 
} 
catch (System.Exception ex) { 
    something.worked = false; 
    something.err = ex.Message; 
    return something; 
} 
finally { 
    stuff.close(); 
} 
+1

@Dlev - Trừ trường hợp đầu tiên không hợp lệ C# để không thể thực hiện được. Vì vậy, làm thế nào nó có thể được ưa thích? Câu hỏi này thực sự nên được yêu cầu một lần nữa, một nơi mà bất kỳ mã nào thực sự là mã hợp lệ, nếu không thì nó là vô nghĩa. –

+0

@Ramhound Rất tiếc, tôi có nghĩa là trước đây không phải là hợp pháp C#. Sau đó thực sự là hợp lệ cú pháp. – dlev

Trả lời

17

Bạn không thể return từ finally. Bạn sẽ nhận được biên dịch lỗi:

Control cannot leave the body of a finally clause


Nếu lớp mục tiêu thực hiện IDisposable sau đó tôi sẽ làm gì tiếp theo:

using (stuff s = new stuff()) 
{ 
    return stuff; 
} 

hoặc

using (stuff s = new stuff()) 
{ 
    try 
    { 
     // do stuff 
     return stuff; 
    } 
    catch (Exception ex) 
    { 
     // do logging or another stuff 
     return something; 
    } 
} 

sẽ gọi Dispose() cho bạn nếu điều đó sẽ được yêu cầu/có thể.

+0

Doh! Thử biên dịch trước khi bạn hỏi lần sau, Tự! Nó có ý nghĩa rằng kiểm soát không thể để lại một cuối cùng kể từ cuối cùng là như vậy duy nhất trong sự chú ý đòi hỏi. – ChuckNeuros

+2

@ user540903: Vâng, vâng, bạn nên biên dịch nó. Nhưng đừng đánh bại bản thân quá tệ; có những ngôn ngữ mà sự trở lại từ cuối cùng là hợp pháp, và những ngôn ngữ đó có một số ngữ nghĩa điều khiển luồng khá lạ. Đó là một câu hỏi hợp lý nói chung, chỉ cần không cho C#. –

+0

@Eric Tôi khá Java là một trong những ngôn ngữ đó. Từ những gì tôi nhớ lại, 'return' gần đây nhất sẽ ghi đè bất kỳ cái nào trước đó, vì vậy' try {throw new BlahException(); } catch {return 1; } cuối cùng {return 2; } 'thực sự trả về một' 2' cho người gọi. – dlev

17

Cá nhân tôi sẽ làm gì không và sẽ sử dụng


try { 
    stuff that changes something... 
} 
catch (System.Exception ex) { 
    something.worked = false; 
    something.err = ex.Message; 
} 
finally { 
    stuff.close();  
} 
return something; 

Cũng trong báo cáo kết quả finally, kiểm tra xem bạn cần phải đóng/dispose của các đối tượng như họ có thể chưa bao giờ được mở/thiết lập nếu họ đã thất bại.

Cũng xem tại đây Is it bad practice to return from within a try catch finally block?

+1

Tôi đồng ý với điều này, như abatishchev nói rằng bạn không thể trở lại trong một cuối cùng, tôi không nghĩ rằng bạn nên có một trở lại trong một bắt. Nếu bạn có một thử bắt và không rethrow bạn muốn nó trở lại một trong hai cách và nếu bạn rethrow sau đó nó sẽ không bao giờ trở lại anyway. Dù bằng cách nào bạn chỉ cần 1 câu lệnh return không phải là 2 –

+1

trở về từ bên trong try/catch/finally không được coi là "lập trình có cấu trúc". Tôi đồng ý với Tim và Ben. –

0

Không có rủi ro trong phương pháp thứ hai. Nhưng nó cho phép bạn trả về các giá trị khác nhau trong trường hợp ngoại lệ.

+1

Vì vậy, không trả về một biến và đặt nó vào các giá trị khác nhau trong khối try và catch nhưng chỉ có 1 trở lại bên ngoài toàn bộ khối try/catach. –

+0

trả về giá trị của một biến cũng sẽ cho phép bạn trả về các giá trị khác nhau trong trường hợp ngoại lệ. –

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