2010-03-16 58 views
11

Trong C#, mã folloing có ném e chứa thông tin bổ sung lên ngăn xếp cuộc gọi không?Ngoại lệ ném

... 
catch(Exception e) 
{ 
    e.Data.Add("Additional information","blah blah"); 
    throw; 
} 

Trả lời

12

Có, nó sẽ. Rất nhiều nhà phát triển không nhận ra rằng mã sau sẽ ném một ngoại lệ mới từ thời điểm đó trong ngăn xếp cuộc gọi, chứ không phải các cuộc gọi được thực hiện trước đó lên ngăn xếp trước catch.

... 
catch(Exception e) 
{ 
    e.Data.Add("Additional information","blah blah"); 
    throw e; 
} 

Tôi đã học được điều này một cách khó khăn!

+0

+1 cho ví dụ chống khiếu nại :) – Pharabus

+1

Đây là bài viết từ Eric Lippert: http://blogs.msdn.com/ericlippert/archive /2010/03/04/too-much-reuse.aspx "The" throw; "không đặt lại dấu vết ngăn xếp," ném ex; "hiện" – ram

1

Ngoại lệ không phải là bất biến và có thể thêm thông tin cho họ là một lý do cho việc này.

Vì vậy, có, dữ liệu sẽ được thêm vào thông tin ngoại lệ sẽ phát ra.

4
 var answer = "No"; 
     try 
     { 
      try 
      { 
       throw new Exception(); 
      } 
      catch (Exception e) 
      { 
       e.Data.Add("mykey", "myvalue"); 
       throw; 
      } 
     } 
     catch (Exception e) 
     { 
      if((string)e.Data["mykey"] == "myvalue") 
       answer = "Yes"; 
     } 

     Console.WriteLine(answer); 
     Console.ReadLine();  

Khi bạn chạy mã bạn sẽ thấy rằng câu trả lời là có :-)

+1

... rất buồn cười;) – Ben

1

Bạn có thể làm điều này nhưng do FxCop Tôi luôn tạo ra ngoại lệ tùy chỉnh khi bao giờ tôi ném và ngoại lệ. Điều này mang lại cho người gọi khả năng dễ dàng nắm bắt và hiểu các loại lỗi khác nhau. Nếu bạn cần bao gồm ngoại lệ tiếp theo, bạn có thể sử dụng InnerException of Exception hoặc chỉ đơn giản là quảng cáo biến thành viên cho Ngoại lệ mới của bạn.

Điều này cho bạn biết cách làm cho bạn sở hữu thành công. http://blog.gurock.com/articles/creating-custom-exceptions-in-dotnet/

Đây là một trong những điều lập trình mà mọi người thích bỏ qua vì nó chỉ đơn giản là làm việc thêm để có được một ứng dụng chức năng.

Đây là trang từ Zen cá nhân của tôi về Lập trình:

Chương trình của bạn là ngôi nhà của bạn. Làm cho nó đẹp như bạn có thể để dễ dàng và thú vị để sống.

+0

+1 cho đề xuất tạo/bắt ngoại lệ tùy chỉnh. Nó rõ ràng là không phụ thuộc nếu bạn có quyền kiểm soát mã mà ném ngoại lệ bạn đang bắt, nếu đó là một thư viện của bên thứ ba bạn đang một chút bị mắc kẹt với bất kỳ trường hợp ngoại lệ nó ném ;-) –