2008-10-12 38 views
10

Tôi có thể thiếu một cái gì đó rõ ràng nhưng có một tài liệu tham khảo một nơi nào đó về những gì ngoại lệ được ném bởi các chức năng trong NET và tại sao ngoại lệ có thể được ném?Làm cách nào để tìm ra ngoại lệ có thể bị hàm .NET thực hiện?

Ví dụ, gần đây tôi đã thử LINQ trong Visual C# 2008 và tôi đang tải một tệp XML vào một XDocument. Nó chỉ là thông qua thử nghiệm mà tôi nhận ra rằng nếu bạn cố gắng tải một tập tin không tồn tại, nó sẽ ném một ngoại lệ FileNotFound, nhưng nếu bạn cố gắng tải một thư mục thay vì một tập tin bạn sẽ nhận được một UnauthorizedAccessException. Ngoài ra nhìn vào không gian tên System.IO tôi có thể thấy những thứ như ngoại lệ FileLoad và PathTooLongException, và tôi có thể đoán khi nào chúng có thể bị ném nhưng có thể có những người khác ở đó có thể bị ném vào một số trường hợp mà tôi chưa nghĩ đến . Giải pháp duy nhất tôi có ngay bây giờ chỉ là nắm bắt những điều tôi biết và sau đó bắt loại ngoại lệ, nhưng tôi thà biết chính xác loại ngoại lệ nào mà tôi có nhiều khả năng gặp phải nhất và tại sao. Tôi đã nghĩ rằng thư viện MSDN sẽ có loại thông tin này, nhưng tôi không thể tìm thấy nó ở bất cứ đâu. Tôi chỉ mù? Thông tin này có ở bất kỳ nơi nào khác không?

EDIT: Một số chi tiết cụ thể hơn, ngay bây giờ tôi đang tìm các ngoại lệ có thể được ném bởi hàm XDocument.Load (chuỗi). Có vẻ như không có gì liên quan trong online documentation hoặc trình duyệt đối tượng. Bây giờ tôi có phải chạy một số thử nghiệm và xem những gì tôi chạy vào không?

Trả lời

8

Câu hỏi hay, bạn có 20/20 tầm nhìn. C# /. NET không thực hiện câu lệnh ném (tức là, ngoại lệ đã kiểm tra).

Bất kỳ ai đến từ một ngôn ngữ như Java đều có khả năng tự hỏi về điều này.

Anders Hejlsberg, cha đẻ của C#, giải thích lý do đằng sau để lại ngoại lệ đã kiểm tra trong C# trong this article/interview. Đó là một đọc tốt.

Từ bài viết đó, Anders nói:

Mối quan tâm tôi có về ngoại lệ kiểm tra là còng tay họ đưa vào lập trình viên. Bạn thấy các lập trình viên chọn các API mới có tất cả các mệnh đề ném này, và sau đó bạn thấy mã của chúng phức tạp như thế nào và bạn nhận ra các ngoại lệ đã kiểm tra không giúp ích gì cho chúng. Đó là loại thiết kế API độc tài này cho bạn biết cách xử lý ngoại lệ của bạn. Họ không nên làm điều đó.

Vì vậy, như Mitch và monoxide đã cho biết, tài liệu MSDN cho .NET FCL liệt kê các ngoại lệ liên quan đến mỗi lớp và cũng có thể có ngoại lệ trong mỗi không gian tên.

+0

Tôi sẽ bao gồm một liên kết đến bài viết đó, nhưng không thể định vị nó - đó là một đọc tốt. +1 –

+0

Xuất phát từ việc làm Java ở đại học và C# tại nơi làm việc, tôi nghĩ đó là điều tôi nhớ nhất từ ​​Java, mặc dù tất nhiên khi tôi còn học đại học và trước khi làm việc trên mã sản xuất, nó cảm thấy như phiền toái, tôi thấy nó thực sự hữu ích để biết những gì ngoại lệ mong đợi. – Davy8

1

.NET không thực hiện bất kỳ thứ gì như từ khóa 'ném' trong java, vì vậy, tốt nhất bạn nên kiểm tra tài liệu MSDN trực tuyến.

CHỈNH SỬA: nếu bạn xem tài liệu Không gian tên (ví dụ: System.IO), danh sách này có thể liệt kê các ngoại lệ có thể bị ném.

+0

Đó không phải là tất cả các khả năng, vì các hàm có thể ném ngoại lệ không phải từ không gian tên riêng của chúng. Ví dụ, ArgumentException, vv –

2

Nếu một hàm ném ngoại lệ, nó thường được liệt kê ở cuối trang trợ giúp ngoại tuyến hoặc trong Trình duyệt đối tượng. Nó cũng được liệt kê ngay bên dưới thông tin về cách gọi hàm trong thư viện MSDN trực tuyến, for example, string.Contains(), nó được gắn nhãn là "Ngoại lệ".

Hơn nữa, nó chỉ có chức năng, thuộc tính, v.v. thực sự ném ngoại lệ, vì vậy những thứ này không được đề cập trong tài liệu chung, chỉ trong tài liệu hướng dẫn cho các chức năng hoặc người truy cập thực sự ném chúng, như trong ví dụ được. Đặt cược tốt nhất của bạn là có một poke xung quanh trình duyệt đối tượng trong VS với lớp/es mà bạn quan tâm.

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