2010-03-25 29 views
5

Tôi đang chạy mã này C# trong Visual Studio trong chế độ gỡ lỗi:Tại sao Visual Studio không hiển thị thông báo ngoại lệ khi ngoại lệ của tôi xảy ra trong một hàm tạo tĩnh?

public class MyHandlerFactory : IHttpHandlerFactory 
{ 
    private static Dictionary<string, bool> myDictionary = new Dictionary<string, bool>(); 
    static MyHandlerFactory() 
    { 
    myDictionary.Add("someKey",true); 
    myDictionary.Add("someKey",true); // fails due to duplicate key 
    } 
} 

Bên ngoài của constructor tĩnh, khi tôi nhận được cho phù hợp với lỗi Visual Studio nhấn mạnh nó và bật lên một thông điệp về sự ngoại lệ . Nhưng trong constructor tĩnh tôi không nhận được thông báo như vậy. Tôi đang bước qua từng dòng, vì vậy tôi biết rằng tôi đang đi đến hàng đó và không còn nữa.

Tại sao điều này?

(Tôi không có ý tưởng nếu điều đó thực tế là lớp học của tôi thực hiện những vấn đề IHttpHandlerFactory, nhưng tôi bao gồm nó chỉ trong trường hợp.)

Đây là VS2005, Net 2.0

Edit: Tôi chỉ muốn để thêm, thực tế rằng đó là một HttpHandler hiện có vẻ quan trọng. Như các câu trả lời đã chỉ ra, hành vi mặc định là phá vỡ TypeInitializationException thay vì ngoại lệ bên trong. Tôi đã thử nghiệm một ví dụ khác mà không có HttpHandler và thấy rằng điều này khiến chương trình phá vỡ dòng đầu tiên sử dụng lớp đó. Nhưng trong trường hợp này không có dòng trong mã của tôi để phá vỡ, vì lớp chỉ được gọi là HttpHandler được chỉ định trong tệp web.config của tôi. Do đó, nó không phá vỡ ngoại lệ chút nào.

Trả lời

9

Vấn đề là ngoại lệ được ném thực sự là một TypeInitializationException bao bọc mọi ngoại lệ được ném. Tôi không chắc chắn những gì thiết kế sự cân bằng gây ra điều này, nhưng IMO nó là một trong những điều gây phiền nhiễu nhất trong phát triển .NET, và tôi rất buồn khi thấy nó vẫn còn xung quanh trong .NET 4.

Trong VS, để bắt ngoại lệ càng sớm càng tốt, bạn sẽ cần phải bật ngoại lệ đầu tiên. Vào Debug> Exceptions và kiểm tra "Common Language Runtime Exceptions", nó sẽ phá vỡ ngay sau khi một ngoại lệ được ném ra.

(Lưu ý: nếu bạn đang sử dụng Thời gian chạy ngôn ngữ động, bạn sẽ cần phải chọn lựa nhiều hơn về ngoại lệ, vì dường như sử dụng ngoại lệ cho điều khiển luồng).

+0

Cảm ơn câu trả lời. Tuy nhiên, các lựa chọn tôi thấy trong Debug> Exceptions ... là "C++ Exceptions", "Common Language Runtime Exceptions", "Managed Debugging Assistants", "Native Run-Time Checks", và "Win32 Exceptions". "Ngoại lệ Net" có thuộc một trong các trường hợp này không? Tôi không thể tìm thấy nó. –

+0

@Tim Goodman - OOPS! Tôi có nghĩa là "Ngoại lệ thời gian chạy ngôn ngữ chung". Tôi sẽ cập nhật câu trả lời của mình. –

+0

Ah có, làm cho nó phá vỡ khi ngoại lệ phổ biến thời gian chạy ngoại lệ được ném gây ra nó để phá vỡ ngoại lệ bên trong. Cảm ơn. –

1

Tôi đã thử mã của bạn và tôi đã nhận được TypeInitializationException như bạn mong đợi. Không có vấn đề gì trong VS của tôi ...

Nhưng nếu bạn chạy ứng dụng này (hoặc bất kỳ ứng dụng nào khác) mà không cần gỡ lỗi, bạn sẽ luôn nhận được thông báo lỗi cho bất kỳ trường hợp ngoại lệ nào không được cài đặt VS.

+0

Bạn đã nhận được TypeInitializationException trên dòng nào? Tôi nghĩ bây giờ vấn đề là nó thường đưa ra một lỗi trên dòng đầu tiên để tham chiếu lớp (cái mà làm cho hàm dựng tĩnh được gọi), nhưng trong trường hợp này nó được gọi là một HttpHandler sao cho không có dòng đi đến. –

+0

TypeInitializationException xuất hiện trên dòng nơi tôi tạo một thể hiện mới của lớp: MyHandlerFactory factory = new MyHandlerFactory(); Nhưng tôi đã thử nó mà không có giao diện mà nó xuất phát từ đó. Có lẽ bạn có thể mở rộng các mẫu mà chúng tôi có thể kiểm tra nó exatly vì nó là trong mã của bạn. – Machta

+0

Tôi đã nhìn vào câu hỏi 7 năm này một lần nữa ngày hôm nay, vì vậy tôi figured tôi belated trả lời bình luận của bạn. :) Để tái tạo vấn đề, tôi tin rằng cần phải đăng ký Trình xử lý HTTP trong Web.config của ứng dụng web ASP.NET (xem tại đây: https://msdn.microsoft.com/en-us/library/46c5ddfy. aspx) và truy cập nó bằng cách cố gắng tải trang của ứng dụng web. –

0

Hàm tạo tĩnh được chạy trước khi ứng dụng của bạn đang chạy trong miền ứng dụng. Điều này có thể gây ra vấn đề với cách VS là bắt ngoại lệ, mà từ mô tả của bạn là khá chuẩn. Nó có thể là một hạn chế của năm 2005. Đó là lý do tại sao bạn nên luôn luôn nắm bắt trong cơ thể của các nhà xây dựng tĩnh. Có một cuộc thảo luận tuyệt vời về điều này trong cuốn sách mới Hiệu quả C#

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