Đừng dừng trình gỡ lỗi tại ngoại lệ ĐÓ khi nó được ném và bắt


91

Trong các công cụ / ngoại lệ, tôi đã đặt tùy chọn mà trình gỡ lỗi dừng khi một ngoại lệ được ném ra. Cho dù nó có bị bắt hay không.

Làm cách nào để loại trừ một ngoại lệ của quy tắc đó? Ở đâu đó trong mã của tôi có một ngoại lệ bị bắt là một phần của logic chương trình. Vì vậy, tôi rõ ràng không muốn ngoại lệ đó dừng trình gỡ lỗi mỗi khi nó được nhấn.

Ví dụ: Tôi muốn bỏ qua ngoại lệ nullreference (bị bắt) trên dòng 344. Tôi muốn dừng lại ở tất cả các trường hợp ngoại lệ khác


6
Khi ngoại lệ này là một phần của logic lập trình của bạn (hãy nghĩ xem, nếu bạn thực sự phải triển khai nó theo cách này) - thì ít nhất nó phải là một ngoại lệ do chính bạn tạo ra. Bằng cách này bạn có thể áp dụng giải pháp của Brian.
tanascius 14/09/09


2
@tanascius - +1 Tôi đồng ý trong hầu hết các trường hợp Ngoại lệ không phải là cách tốt nhất để đưa ra quyết định hợp lý; tuy nhiên trong một số trường hợp như khi deserializing xử lý các ngoại lệ đôi khi không thể tránh khỏi vì vậy ném> bắt> xử lý là lựa chọn hợp lý duy nhất.
jpierson

2
@Ando xin lỗi tôi xấu. Kiểm duyệt nhiều tab cùng một lúc là hiệu quả, nhưng không phải lúc nào cũng chính xác.

2
@tanascius: bạn vẫn có thể phải bắt một ngoại lệ khung đã biết trước khi bạn có thể phản ứng lại. Đề xuất của bạn không phải lúc nào cũng khả thi.
Dan Puzey

Câu trả lời:


40

Nếu tôi nhớ chính xác, bạn có thể sử dụng một DebuggerStepThroughthuộc tính trên phương thức có chứa mã mà bạn không muốn kích hoạt ngoại lệ. Tôi cho rằng bạn có thể cô lập mã kích hoạt ngoại lệ khó chịu trong một phương thức và trang trí nó bằng thuộc tính.


31
Từ câu trả lời của kẻ xấu và kinh nghiệm của tôi, câu trả lời này dường như không chính xác. Các DebuggerStepThroughthuộc tính không ảnh hưởng đến hành vi của debugger với ngoại lệ đầu tiên có cơ hội.
Michael Petrotta

5
@Tim, tôi đã thử nghiệm và nó KHÔNG dừng lại. kiểm tra câu trả lời của tôi: stackoverflow.com/questions/1420390/3455100#3455100
Shimmy Weitzhandler,

1
+1 hoạt động trong VS2010 cho mã .NET 4.0 thuần túy và Silverlight 4 cho các trường hợp ngoại lệ không được khắc phục.
Mike Đăng

6
Lưu ý quan trọng: Điều này không hoạt động đối với các phương thức loại async-await. Xem thêm ở đây
i3arnon

8
Theo MSDN, DebuggerStepThroughthuộc tính không có ý nghĩa đối với CLR. Nó được giải thích bởi trình gỡ lỗi. Dường như nó không đáng tin cậy làm việc dưới nhiều hoàn cảnh, và điều đó DebuggerHiddensẽ làm việc đáng tin cậy stackoverflow.com/a/3455100/141172
Eric J.

64

DebuggerHidden là bạn của bạn!

Thời gian chạy ngôn ngữ chung không gắn thuộc tính này về ngữ nghĩa. Nó được cung cấp cho các trình gỡ rối mã nguồn sử dụng. Ví dụ, trình gỡ lỗi Visual Studio 2005 không dừng lại trong một phương pháp được đánh dấu bằng thuộc tính này và không cho phép thiết lập một điểm ngắt trong phương thức. Các thuộc tính gỡ lỗi khác được công nhận bởi trình gỡ lỗi Visual Studio 2005 là DebuggerNonUserCodeAttribute và DebuggerStepThroughAttribute.

Đã thử nghiệm trên VS2010 và hoạt động tốt.

Mặc dù DebuggerStepThroughdường như cũng hoạt động đối với một số phiên bản trình gỡ lỗi cụ thể, nhưng DebuggerHiddendường như hoạt động đối với nhiều trường hợp hơn dựa trên các nhận xét cho cả hai câu trả lời.

Lưu ý rằng cả hai tùy chọn hiện không hoạt động với các phương thức khối trình vòng lặp hoặc đối với các phương thức không đồng bộ / chờ đợi . Điều này có thể được khắc phục trong bản cập nhật sau của Visual Studio.


làm việc trên VS2008. Bạn phải áp dụng nó cho toàn bộ phương pháp bao gồm cả khối bắt, hoặc bạn sẽ chỉ phá vỡ ở một nơi khác
Mark Heath

1
Tôi đã thêm thuộc tính đó vào một phương thức và thay vào đó, trình gỡ lỗi chỉ dừng lại trên cách gọi của nó. Tui bỏ lỡ điều gì vậy?
Doogal

1
Đó là cách nó phải như vậy. để tránh điều đó, bạn sẽ phải xử lý các ngoại lệ ... Hoặc cách khác đánh dấu phương pháp gọi là DebuggerHiddencũng ...
Shimmy Weitzhandler

1
Lưu ý rằng thuộc tính DebuggerStepThrough phải đủ để tránh vi phạm các ngoại lệ. DebuggerHidden hoạt động giống như sự kết hợp của cả DebuggerNonUserCode và DebuggerStepThrough Attribute.
jpierson


14

DebuggerStepThrough là phần mềm được sử dụng để ngăn trình gỡ lỗi bị phá vỡ trong một phương thức có thử / bắt.

Nhưng nó chỉ hoạt động nếu bạn không bỏ chọn tùy chọn "Bật mã chỉ của tôi (Chỉ được quản lý)" trong cài đặt Chung của Tùy chọn gỡ lỗi của Visual Studio (menu Công cụ / Tùy chọn, nút Gỡ lỗi / Chung) ...

Thông tin thêm về thuộc tính đó trên http://abhijitjana.net/2010/09/22/tips-on-debugging-using-debuggerstepthrough-attribute/

DebuggerHidden sẽ đơn giản ngăn Trình gỡ lỗi hiển thị phương thức mà ngoại lệ được ném ra. Thay vào đó, nó sẽ hiển thị phương thức đầu tiên trên ngăn xếp không được đánh dấu bằng thuộc tính đó ...


1
Lưu ý rằng tính năng này không còn hoạt động theo mặc định trong VS 2015, hãy xem blog VS để biết cách kích hoạt nó
bhh 14/03/2016

Đáng tiếc là công việc xung quanh VS 2015 không hoạt động cho VS 2019.
Jonathan Allen

13

Các thuộc tính được chỉ định trong các câu trả lời khác (và các DebuggerNonUserCodethuộc tính khác chẳng hạn như thuộc tính) không còn hoạt động theo cách tương tự theo mặc định trong Visual Studio 2015. Trình gỡ lỗi sẽ phá vỡ các ngoại lệ trong thị trường phương pháp với các thuộc tính đó, không giống như trong các phiên bản cũ hơn của VS. Để tắt tính năng nâng cao hiệu suất đã thay đổi hành vi của chúng, bạn cần thay đổi cài đặt đăng ký:

reg add HKCU\Software\Microsoft\VisualStudio\14.0_Config\Debugger\Engine /v AlwaysEnableExceptionCallbacksOutsideMyCode /t REG_DWORD /d 1

Thông tin thêm có thể được tìm thấy trên blog studio trực quan .

(Đây có lẽ nên là một bình luận về câu trả lời hàng đầu nhưng tôi không có đủ đại diện)


3

Bạn không thể chỉ ra một ngoại lệ được đưa vào một vị trí cụ thể trong mã của bạn. Tuy nhiên, bạn có thể vô hiệu hóa các lối ra của một loại cụ thể.

Nếu mã của riêng bạn ném ngoại lệ được đề cập, tôi sẽ đặt ngoại lệ đó thành ngoại lệ tùy chỉnh, bắt nguồn từ bất kỳ điều gì phù hợp, sau đó vô hiệu hóa việc gỡ lỗi trên loại bắt nguồn này.

Việc vô hiệu hóa hệ thống ngoại lệ như NullReferenceException sẽ ảnh hưởng đến toàn bộ hệ thống, điều này tất nhiên là không mong muốn trong quá trình phát triển.

Lưu ý rằng có hai loại hành vi phá vỡ cho các trường hợp ngoại lệ:

  • Ném: Nếu được chọn, ngắt ngay sau khi loại trừ này được ném ra
  • Người dùng không xử lý: Nếu được chọn, chỉ ngắt nếu ngoại lệ, thuộc loại này, không được xử lý bởi thử / bắt.

Bạn có thể xóa kiểm tra trong 'Thrown' cho NullReferenceException, điều này sẽ mang lại cho bạn lợi ích là không bị hỏng mỗi khi hệ thống của bạn vượt qua dòng được đề cập trong mã của bạn, nhưng vẫn bị hỏng nếu bạn có một số phát hiện NullReference không được xử lý xuất hiện trong các phần khác của hệ thống.


3
Thêm thuộc tính DebuggerStepThrough vào một phương thức trong Visual Studio 2010 sẽ ngăn trình gỡ lỗi tạm dừng một ngoại lệ không được xử lý được đưa ra bởi phương thức.
Tim Murphy

Tôi đã thử nghiệm và nó không ngăn cản; nó vẫn dừng lại
Shimmy Weitzhandler

1
@Shimmy - Làm việc cho tôi! Đảm bảo rằng bạn đang áp dụng DebuggerStepThrough cho từng phương thức từ điểm mà nó được ném cho đến khi bạn muốn ngoại lệ hiển thị trong ngăn xếp cuộc gọi. Nếu bạn bắt được ngoại lệ và xử lý nó trong cấu trúc phân cấp cuộc gọi nơi tất cả các phương thức được trang trí bằng DebuggerStepThrough, bạn sẽ không bao giờ thấy VS break trên ngoại lệ đó.
jpierson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.