Như một vài câu trả lời đã chỉ ra, yêu cầu Visual Studio phá vỡ Throw for NullReferenceException.
Làm thế nào để nói với VS để phá vỡ khi ngoại lệ unhandled được ném
- menu Debug | Trường hợp ngoại lệ (hoặc Ctrl +Alt +E)
- khoan vào Common Language Runtime Exceptions
- khoan vào hệ thống
- Tìm System.NullRefernceException, và đánh dấu vào hộp để Phá vỡ bất cứ khi nào ngoại lệ này được ném, thay vì cho phép nó tiếp tục với bất kỳ khối Bắt nào được đặt tại vị trí
Vì vậy, bây giờ khi xảy ra, VS sẽ phá vỡ ngay lập tức và dòng Tuyên bố hiện tại sẽ nằm trên biểu thức được đánh giá là null.
cơ sở này rất hữu ích cho tất cả các loại ngoại lệ, bao gồm những tùy chỉnh (có thể thêm các loại tên đầy đủ, và VS sẽ phù hợp với nó vào gỡ lỗi thời gian)
Một nhược điểm để phương pháp này là nếu có mã được tải trong trình gỡ rối theo các hành động xấu của việc ném và bắt rất nhiều ngoại lệ bạn đang tìm kiếm, trong trường hợp nó quay trở lại thành vấn đề về cỏ khô (trừ khi bạn có thể sửa mã đó - sau đó bạn đã giải quyết xong hai vấn đề :)
Một mẹo khác có thể hữu ích (nhưng chỉ bằng một số ngôn ngữ) là việc sử dụng o f Khi (hoặc tương đương) từ khóa ... Trong VB, điều này có vẻ như
Try
' // Do some work '
Catch ex As Exception When CallMethodToInspectException(ex)
End Try
Bí quyết ở đây là sự biểu hiện Khi được đánh giá trước callstack là unwound vào khối Catch. Vì vậy, nếu bạn đang sử dụng trình gỡ lỗi, bạn có thể đặt một điểm ngắt biểu thức đó và nếu bạn nhìn vào cửa sổ gọi (Debug | Windows | Callstack), bạn có thể xem và điều hướng đến dòng đã kích hoạt ngoại lệ.
(Bạn có thể chọn trả về false từ CallMethodToInspectException, vì vậy khối catch sẽ bị bỏ qua và thời gian chạy sẽ tiếp tục tìm kiếm thông qua ngăn xếp cho khối catch thích hợp - có thể cho phép ghi nhật ký không ảnh hưởng đến hành vi, và với chi phí ít hơn một nắm bắt và tái ném)
Nếu bạn chỉ quan tâm đến khai thác gỗ không tương tác, sau đó giả sử bạn đã có một Debug xây dựng (hoặc một mức độ nào là bạn có làm đối phó với vấn đề tối ưu hóa, Phát hành bản phát hành với PDB), bạn có thể nhận được hầu hết thông tin cần thiết để theo dõi lỗi từ Ngoại lệ ToString, với số lượng dấu vết có chứa dấu vết.
Nếu số dòng không đủ, bạn cũng có thể lấy số cột (rất nhiều, địa phương hoặc biểu thức cụ thể là rỗng) bằng cách trích xuất StackTrace cho ngoại lệ (sử dụng kỹ thuật trên hoặc chỉ trong khối catch tự):
int colNumber = new System.Diagnostics.StackTrace(ex, true).GetFrame(0).GetFileColumnNumber();
trong khi tôi đã không nhìn thấy những gì nó làm cho NullReference hoặc thời gian chạy ngoại lệ phát sinh khác, cũng có thể quan tâm đến việc xem xét Exception Hunter như một công cụ phân tích tĩnh.
Tôi không hiểu - nếu bạn đặt trình gỡ lỗi để phá vỡ NullReferenceExceptions, chắc chắn bạn có thể thấy biến nào gây ra lỗi tại thời điểm ngoại lệ được ném? – Grokys