2013-02-20 6 views
5

Tham chiếu C# cho dấu ngoặc vuông cho biết: Dấu ngoặc vuông [] được sử dụng cho mảng, chỉ mục và thuộc tính. Chúng cũng có thể được sử dụng với con trỏ. (Nó cũng cho biết, đối với mảng) Một ngoại lệ được ném nếu một chỉ mục mảng nằm ngoài phạm vi.Làm cách nào để xác định ngoại lệ nào "x []" có thể bị ném?

Vì vậy, khi bạn đang sử dụng dấu ngoặc vuông trên một thứ gì đó không phải là mảng, làm thế nào để bạn biết ngoại lệ nào có thể bị ném?

Đối với từ điển (ví dụ) nếu bạn sử dụng phương thức truy nhập như Dictionary.TryGetValue, bạn có thể dễ dàng tra cứu các ngoại lệ mà phương pháp có thể ném, nhưng C# reference for square brackets [] chỉ cho biết có thể ném ngoại lệ ra khỏi phạm vi trên các mảng.

Vì vậy, nếu bạn muốn sử dụng dấu ngoặc vuông cho một số loại dữ liệu, bạn có thể tra cứu ngoại lệ nào có thể được ném cho loại dữ liệu đó?

Tôi đã thử truy cập thành viên không tồn tại của từ điển, chỉ để xem điều gì xảy ra và tôi nhận KeyNotFoundException. Tôi biết bạn cũng có thể nhận được NullReferenceException. Tài liệu này ở đâu? Và danh sách đầy đủ là gì?

+1

tại sao bạn cần danh sách? Có một 'catch (Exception ex)' chung không hoạt động? – DiskJunky

+1

@DiskJunky, bắt ngoại lệ chung là một thực tế tồi tệ nhất (ngoại trừ ở cấp cao nhất khi bạn có thể đăng nhập và vẫn đẩy ra). –

+0

@pst đồng ý, cũng vì nó có thể bị quá tải, bạn có thể triển khai thực hiện lập chỉ mục của riêng bạn và ném bất kỳ thứ gì bạn thích :) – RobJohnson

Trả lời

4

Tài liệu được thực hiện với từng triển khai. Không có danh sách đầy đủ vì người vận hành có thể bị quá tải, do đó, bất kỳ ngoại lệ nào cũng có thể bị ném. Toán tử thường được ghi thành tài sản Item.

Dưới đây là một số tài liệu về cách sử dụng cụ thể:

Dictionary.Item

Array.Item

Tuy nhiên, bạn không cần một danh sách đầy đủ về những gì thể được ném ra. Ngoại lệ thường bị bắt vì một trong hai lý do: hoặc bạn muốn làm điều gì đó về nó (như những ngày trước khi TryParse khi bắt ngoại lệ là cách đơn giản nhất để bắt định dạng ngày xấu) hoặc bạn chỉ muốn lưu ý rằng một ngoại lệ xảy ra và đăng nhập nó, trong trường hợp này bạn thường rethow ngoại lệ thực tế.

Ghi ngoại lệ cụ thể là tốt cho trường hợp trước đây. Ví dụ, nếu bạn bắt một NullReferenceException nó thường để lại ném một ngoại lệ khác nhau cho biết tham chiếu là null (vì đây không phải là một phần của các cổ phiếu NullReferenceException).

Trong trường hợp sau, bắt một generic Exception là tốt nếu bạn chỉ muốn để đăng nhập và tái ném vì không có khả năng không có gì khác bạn có thể làm gì về nó.

+0

Cảm ơn - Tôi không thực sự muốn biết những gì * có thể * được ném ra vì lợi ích của việc biết mọi thứ. Tôi chỉ muốn biết vì lợi ích của việc biết cái gì là hợp lệ, vì vậy tôi có thể tưởng tượng liệu tôi có muốn xử lý nó không. Trường hợp và điểm: Trong câu hỏi của tôi, tôi nói từ điển có thể ném NullReferenceException, nhưng khi nó quay ra, khi bạn nhìn vào thuộc tính Item, nó thực sự có thể ném ArgumentNullException. Vì vậy, nếu tôi viết mã để bắt NullReferenceException, tôi nghĩ rằng tôi đang bao gồm các bài hát của tôi, nhưng tôi thực sự ngu ngốc viết mã rác. –

+0

@EdwardNedHarvey - vâng, "rác" rất mạnh. Nếu bạn chỉ nắm bắt 'NullReferenceException' và nó ném một' ArgumentNullException', tất cả điều đó sẽ xảy ra là ngoại lệ sẽ bị bắt cao hơn stack, hoặc bởi mã của bạn hoặc bởi mã khung. –

+0

@D Stanley điểm là, mà không nhìn lên ngoại lệ thực tế có thể được ném ra, tôi dễ bị viết mã, nghĩ rằng tôi đang bắt một ngoại lệ mà tôi không bắt. Sau đó, khi tôi gỡ lỗi nó, tôi sẽ thấy nó ném "Null" ngoại lệ nhưng nó không bắt "ngoại lệ" Null nhưng mã nói để bắt "Null" cho đến khi tôi quay vòng tròn và cuối cùng tìm ra có nhiều hơn một loại ngoại lệ "Null" khác. Yup, đó sẽ là mã rác. Tệ hơn rác. Tôi rất vui vì có câu trả lời cho câu hỏi này ngay bây giờ, vì vậy tôi sẽ không phạm sai lầm đó, và tôi có thể tìm kiếm những nơi tôi đã làm. –

1

Nói chung, dấu ngoặc vuông cơ bản cho phép bạn truy cập thuộc tính được lập chỉ mục - vì vậy bất kỳ lỗi nào được đề cập trong trình đánh chỉ mục thuộc tính của đối tượng bạn đang sử dụng.

Đối với mảng, nó có thể là chỉ mục nằm ngoài phạm vi, đối với DataRow, nó có thể là cột không được tìm thấy, v.v.

4

Khi [] Operator được áp dụng cho một TKey điển <, TValue > hoặc Danh sách <T>, nó viện dẫn ví dụ của indexer. Một bộ chỉ mục là một thuộc tính đặc biệt với các tham số và là thường được gọi là Item.

  • Dictionary<TKey, TValue>.Item Property
    ArgumentNullException – chínhnull.
    KeyNotFoundException – Thuộc tính được truy xuất và khóa không tồn tại trong bộ sưu tập.

  • List<T>.Item Property
    ArgumentOutOfRangeException – index nhỏ hơn 0 -hoặc- index là bằng hoặc lớn hơn Đếm.

  • ...

1

Khi được sử dụng để truy cập vào một mảng, nó có thể ném một IndexOutOfRangeException.

Khi được sử dụng để đạt được điều đó, nó không thể ném bất kỳ ngoại lệ nào, vì bất kỳ lỗi nào cũng sẽ có lúc biên dịch.

Khi được sử dụng để truy cập trình chỉ mục, nó có thể ném bất kỳ ngoại lệ nào. Người lập chỉ mục có thể được thực hiện theo bất kỳ cách nào bạn muốn và ném bất kỳ ngoại lệ nào mà nó thích.