2012-02-27 35 views
16

Tôi có đoạn mã sau:Catch ngoại lệ, thêm dữ liệu, và rethrow nó

try 
{ 
    OnInitialize(); 
} 
catch (PageObjectLifecycleException exception) 
{ 
    exception.OldLifecycleState = CurrentLifecycleState; 
    exception.RequestedLifecycleState = LifecycleState.Initialized; 
    throw exception; 
} 

tôi bắt một ngoại lệ, thêm một số dữ liệu hơn với nó, và rethrow nó. Resharper cảnh báo tôi (chính xác) rằng một rethrow cũng có tiềm năng dự định và đề nghị thay đổi nó để:

throw; 

Nhưng tôi tự hỏi: Điều này sẽ rethrow đúng sửa đổi ngoại lệ hoặc một bản gốc chưa sửa đổi?

Chỉnh sửa: Để trả lời nhận xét "Thử và xem": Tôi mới sử dụng C#, đến từ C++. Trong C++ bạn thường thấy hành vi không xác định trong các trường hợp góc như thế này và tôi quan tâm đến việc những gì tôi muốn thực sự là nó hoạt động như thế nào.

+6

Hãy thử nó và xem những gì sẽ xảy ra? –

+0

nó sẽ xem xét lại bất cứ điều gì tham chiếu là chỉ quá - trong trường hợp của bạn sửa đổi "ngoại lệ". –

Trả lời

8

Nó sẽ ném tham chiếu đến ngoại lệ đã sửa đổi.

Tuy nhiên tôi không chắc đây có phải là kiểu lập trình tốt hay không. Xem xét việc tạo một ngoại lệ mới và thêm PageObjectLifecycleException làm ngoại lệ bên trong của nó. Bằng cách này, mã xử lý có thể chắc chắn liệu nó có thông tin bổ sung chính xác hay không.

+0

Tôi cũng vậy, đây là một kẻ lừa đảo thực sự. Ví dụ bên ngoài khối chà đạp trên các dữ liệu được truyền lại từ một sâu hơn một ví dụ. –

+0

Mẫu mã được đơn giản hóa. Không có dữ liệu hiện có nào bị ghi đè, chỉ một số dữ liệu bổ sung còn thiếu được cung cấp. –

+0

@TonyHopkinson 'Exception.Data' có vẻ như được cho mục đích này ([ở đây] (https://msdn.microsoft.com/en-us/library/system.exception.data (v = vs.110)) .aspx)) – drzaus

2

Ngoại lệ hiện tại được ném lại, mặc dù tôi không chắc chắn rằng mẫu của bạn là một mẫu rất đẹp và dễ bảo trì.

22

Tôi biết câu trả lời đã được chọn nhưng dưới đây là thông tin thêm về chủ đề này.

try { 
    // code 
} 
catch(Exception e) { 
    throw e; 
} 

Đoạn mã trên khi biên dịch thành IL sẽ tạo ra một cuộc gọi đến throw đi qua một tham chiếu đến các ngoại lệ xử lý như một cuộc tranh cãi. Như bạn có thể biết, bạn có thể gọi throw từ bất kỳ đâu trong mã của bạn để tăng ngoại lệ.

try { 
    // code 
} 
catch(Exception e) { 
    throw; 
} 

Mã trên khi được biên dịch thành IL sẽ tạo cuộc gọi đến rethrow. Điều này khác với throwrethrow được sử dụng để báo hiệu khối đã xử lý ngoại lệ vì một số lý do quyết định không xử lý và do đó, trách nhiệm phải được cung cấp cho khối bắt lệnh cao hơn (tiếp theo).

Phương thức rethrowgiữ lại theo dõi ngăn xếp cuộc gọi hiện tại để nguồn gốc của ngoại lệ có thể được theo dõi. Tuy nhiên, phương thức throw bắt đầu theo dõi ngăn xếp cuộc gọi mới. Tôi nghĩ rằng điều này có ý nghĩa khi bạn hiểu hai phương pháp được sử dụng để làm gì.

Theo kinh nghiệm của mình, bạn sử dụng throw exception; khi bạn muốn ném ngoại lệ vì lý do nào đó (ví dụ: xác thực đối tượng không thành công) và bạn sẽ sử dụng throw; trong câu lệnh bắt đầu. truy cập thông tin hữu ích trong đối tượng không xác thực được trước khi chuyển trách nhiệm xử lý ngoại lệ sang cấp cao hơn).

Trong ví dụ của bạn, tôi sẽ đề xuất rằng nếu bạn cần thêm thông tin khác vào ngoại lệ, bạn có trường hợp để tạo ngoại lệ hoàn toàn mới và tăng nó. Vì vậy, bạn sẽ sử dụng phương thức throw exception; trong đó "ngoại lệ" là một ngoại lệ mới chứa thông tin bổ sung và ngoại lệ được ném ban đầu.

Hy vọng điều đó sẽ hữu ích!

James

9

Bạn có thể thêm các thông tin thêm vào dữ liệu và tái ném ngoại lệ với throw nên duy trì hình thức ban đầu của nó và callstack

try 
{ 
    ... 
} 
catch (PageObjectLifecycleException exception) 
{ 
    exception.Data.Add("additional data", "the additional data"); 
    throw; 
} 
+2

Điều này thực sự là câu trả lời được chấp nhận, đó là những gì 'Dữ liệu' dành cho. Miễn là một bảo vệ chống lại xung đột chính và lưu ý rằng bất kỳ thông tin nào có trong từ điển là 1) được truyền bá chuỗi cuộc gọi và 2) có thể được sửa đổi trên đường đi, đó là một cách tuyệt vời để thêm thông tin hữu ích để dễ dàng gỡ lỗi. –

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