2014-12-19 12 views
7

Bạn có thể nhận được số KeyNotFoundException khi gọi một từ điển bằng cách nào?Làm thế nào có thể ContainsKey (chuỗi khóa) ném một KeyNotFoundException trên một từ điển <string, string>?

Với chữ ký của phương pháp tôi đang kêu gọi:

IDictionary<string, string> RequestParams { get; } 

Với cuộc gọi mà tôi đang làm:

Cho rằng tôi đang trở về một Dictionary<string, string> như sau:

public IDictionary<string, string> RequestParams 
    { 
     get 
     { 

      NameValueCollection nvc = HttpContext.Request.Params; 

      #region Collect the Request Params 
      Dictionary<string, string> dict = new Dictionary<string, string>(); 
      nvc.AllKeys.ForEach(s => dict[s] = nvc[s]); 
      #endregion 

      #region Collect the Route Data Present in the Url 
      RouteData.Values.ForEach(pair => 
      { 
       string param = (pair.Value ?? "").ToString(); 
       if (!String.IsNullOrEmpty(param) && Uri.AbsolutePath.Contains(param)) 
        dict[pair.Key] = param; 
      }); 
      #endregion 

      return dict; 
     } 
    } 

Và tôi đã thực sự inpe cted rằng nó thực sự trả lại một instantiated và populated Dictionary<string, string>

+1

Loại lớp là 'RequestParams' khi bạn nhận được ngoại lệ? Ngoài ra, bạn nên chỉnh sửa câu hỏi của mình để nói "Cho rằng tôi đang trả về một' IDictionary '" – mason

+0

@mason Tôi đã thêm phương thức triển khai. Mã được quản lý. –

+2

'ContainsKey' không phải là ném ngoại lệ, tài sản của bạn getter là. Và đó là lý do tại sao bạn không bao giờ đặt mã đáng ngạc nhiên như thế này trong getters tài sản. Xây dựng một đối tượng mới mỗi khi nó được gọi là bất ngờ, đặc biệt nếu xây dựng nó có thể * thất bại * - getters không nên ném ngoại lệ. –

Trả lời

7

Thông báo, không Dictionary, nhưng IDictionary. Việc triển khai cơ bản có thể làm bất cứ điều gì nó muốn làm, thậm chí tắt máy tính của bạn.

Dictionary không ném bất kỳ ngoại lệ nào (ngoại trừ khóa ngoại lệ) khi sử dụng ContainsKey.

Có thể thực hiện cụ thể IDictionary bạn đang sử dụng, ném KeyNotFoundException, nhưng điều đó vẫn còn kỳ lạ - mặc dù, tôi đã nhìn thấy rất nhiều thứ kỳ lạ, vì vậy đừng hoảng sợ :-)!

Nguyên nhân có thể:

  • getter của bạn là ném ngoại lệ thông qua thu khí khác - sử dụng StackTrace để tìm hiểu nguồn gốc.
  • Bạn đang sử dụng sai Dictionary, đảm bảo bạn có không gian tên System.Collections.Generic
  • Bạn có thể đang chạy mã cũ - điều này đã xảy ra với tôi, rất đau đớn. Ngay cả các biểu tượng gỡ lỗi cũng có thể hoạt động. Chỉ cần thực hiện một số sửa đổi: nhận xét điều gì đó hiển nhiên và xem liệu nó có tác động hay không. Nếu bạn nhận xét ra dòng 64 và bạn nhận được KeyNotFoundException, bạn biết điều gì đó là ... không tốt^_^
+0

Thậm chí hành vi khóa null cũng không nhất thiết phải dựa vào tài liệu đó. để được null. "' –

+0

@ JeffWard Bạn đang bối rối 'IDictionary' với' Dictionary'? Chris đã nói về việc 'Dictionary' đang thực hiện' ContainsKey' – mason

+0

@ mason: Tôi đang mong đợi "ahh nó không phải là mã mới nhất mà tôi đang chạy" hoặc cái gì đó tương tự - theo như getter đi, không có gì sai với nó cũng không phải. 'NameValueCollection' không ném' KeyNotFoundException' nào cả, và chỉ mục từ điển không bao giờ được sử dụng trong biểu thức. Có lẽ thứ cấp getter :-)? –

1

Nó không thể ném ngoại lệ đó.

xem xét các báo cáo sử dụng của tệp có bộ khởi động. Bạn thấy:

using System.Collections.Generic; 

hoặc là nó:

using MyAmazingLib.BetterThanMS.Collections; 
Các vấn đề liên quan