Visual Studio: Làm thế nào để phá vỡ các ngoại lệ được xử lý?


165

Tôi muốn Visual Studio phá vỡ khi xảy ra ngoại lệ được xử lý (nghĩa là tôi không chỉ muốn xem thông báo "Cơ hội đầu tiên", tôi muốn gỡ lỗi ngoại lệ thực tế).

ví dụ: tôi muốn trình gỡ lỗi phá vỡ ngoại lệ:

try
{
   System.IO.File.Delete(someFilename);
}
catch (Exception)
{
   //we really don't care at runtime if the file couldn't be deleted
}

Tôi đã xem qua các ghi chú cho Visual Studio.NET:

1) Trong VS.NET, hãy chuyển đến Trình đơn gỡ lỗi >> "Ngoại lệ ..." >> "Ngoại lệ thời gian chạy ngôn ngữ chung" >> "Hệ thống" và chọn "System.NullReferenceException"

2) Ở dưới cùng của hộp thoại đó có hộp nhóm "Khi ngoại lệ được ném:", chọn "Đột nhập vào trình gỡ lỗi"

3) Chạy kịch bản của bạn. Khi ngoại lệ được ném, trình gỡ lỗi sẽ dừng và thông báo cho bạn với hộp thoại có nội dung như: "Một ngoại lệ của loại" System.NullReferenceException "đã bị ném. [Break] [Tiếp tục]"

Nhấn [Phá]. Điều này sẽ đưa bạn vào dòng mã gây ra vấn đề.

Nhưng chúng không áp dụng cho Visual Studio 2005 (không có tùy chọn Ngoại lệ trên menu Debug ).

Có ai biết hộp thoại tìm tùy chọn này trong Visual Studio rằng hộp nhóm " Khi ngoại lệ được ném ", với tùy chọn " Đột nhập vào trình gỡ lỗi " không?

Cập nhật: Vấn đề là menu Debug của tôi không có mục Ngoại lệ . Tôi tùy chỉnh menu để thêm nó bằng tay.


9
Trong VS2015, nó nằm trong Debug-> Windows-> Exception Settings
PeterVermont

Đã cho tôi một thời gian để tìm cách khôi phục các mặc định thiết lập ngoại lệ sau khi tôi thay đổi một số thiết lập ngoại lệ, do đó một câu trả lời mới. khôi phục cài đặt ngoại lệ về mặc định
Mabito

Câu trả lời:


170

Với một giải pháp mở, hãy đi tới tùy chọn menu Gỡ lỗi - Ngoại lệ ( Ctrl+ D, E). Từ đó, bạn có thể chọn phá vỡ trên Thrown hoặc Người dùng chưa xử lý trường hợp ngoại lệ .

EDIT: Ví dụ của tôi được thiết lập với "hồ sơ" C # có lẽ nó không có ở đó cho các hồ sơ khác?


10
Tôi chỉ không có một lựa chọn như vậy. Điều đó sẽ giải thích sự nhầm lẫn của tôi.
Ian Boyd

58
tôi đã có menu gỡ lỗi, nhưng không có tùy chọn Ngoại lệ. tôi tùy chỉnh menu để thêm nó bằng tay; phím tắt hoạt động theo bất kỳ cách nào (Ctrl + Alt + E)
Ian Boyd

3
Ngoài ra, bạn có thể đặt lại môi trường VS2010, bằng cách đi tới "Công cụ", "Nhập cài đặt xuất" và chọn đặt lại vào môi trường C # ... nó chứa mục
Submenu

14
Tôi đã chọn Common Language Runtime Exceptions> <All Common Language Runtime Exceptions not in this list>trong Visual Studio 2017 và tất cả những giấc mơ điên rồ nhất của tôi đã thành hiện thực.
Aaron Newton

9
Visual Studio 2015: Gỡ lỗi -> Windows -> Cài đặt ngoại lệ
achecopar

47

Có một cửa sổ 'ngoại lệ' trong VS2005 ... hãy thử Ctrl+ Alt+ Ekhi gỡ lỗi và nhấp vào hộp kiểm 'Ném' cho ngoại lệ bạn muốn dừng lại.


Đó chính xác là những gì tôi muốn. Cái đó ở đâu trong thực đơn? Đối với cuộc sống của tôi, tôi không thể tìm thấy nó.
Ian Boyd

Phím tắt có thể thay đổi theo cấu hình (nhà phát triển C #, nhà phát triển C ++, v.v.)
Asaf R

1
Tôi có một mục menu: Gỡ lỗi -> Ngoại lệ. Đây là với VS2005 Professional. Bạn đang chạy một phiên bản Express?
Rob Walker

5
nếu bạn muốn mục menu Exceptions: Chọn Tools | Tùy chỉnh .... Nhấp vào tab Lệnh. Chọn danh mục Gỡ lỗi trong hộp Danh mục. Tìm mục ngoại lệ ... lệnh, sau đó kéo nó vào menu Gỡ lỗi ở đầu ứng dụng, thả nó vào vị trí thích hợp trong menu. (tìm thấy trong các ý kiến trên: blogs.vertigo.com/personal/keithc/Blog/archive/2007/07/20/... )
Sotto

33

Mất một lúc để tìm địa điểm mới cho cài đặt phơi sáng, do đó, một câu trả lời mới.

Kể từ Visual Studio 2015, bạn sẽ kiểm soát ngoại lệ nào sẽ dừng trong Cửa sổ cài đặt ngoại lệ (Gỡ lỗi-> Windows-> Cài đặt ngoại lệ). Phím tắt vẫn là Ctrl- Alt- E.

Cách đơn giản nhất để xử lý các ngoại lệ tùy chỉnh là chọn "tất cả các ngoại lệ không có trong danh sách này".

Đây là một ảnh chụp màn hình từ phiên bản tiếng Anh:

nhập mô tả hình ảnh ở đây

Đây là một ảnh chụp màn hình từ phiên bản tiếng Đức:

nhập mô tả hình ảnh ở đây


16

Từ Visual Studio 2015 trở đi, bạn cần vào hộp thoại "Cài đặt ngoại lệ" ( Ctrl+ Alt+ E) và kiểm tra "Ngoại lệ thời gian chạy ngôn ngữ chung" (hoặc một trường hợp cụ thể mà bạn muốn ArgumentNullException) để làm cho nó phá vỡ các ngoại lệ được xử lý .

Bước 1 Bước 1 Bước 2 Bước 2


8

Kiểm tra Quản lý ngoại lệ với trang Trình gỡ lỗi , nó giải thích cách thiết lập điều này.

Về cơ bản, đây là các bước (trong quá trình gỡ lỗi):

  1. Trên menu Gỡ lỗi, bấm Ngoại lệ.

  2. Trong hộp thoại Ngoại lệ, chọn Ném cho toàn bộ danh mục ngoại lệ, ví dụ: Ngoại lệ Thời gian chạy Ngôn ngữ Chung.

    -hoặc là-

    Mở rộng nút cho một danh mục ngoại lệ, ví dụ: Ngoại lệ thời gian chạy ngôn ngữ chung và chọn Ném cho một ngoại lệ cụ thể trong danh mục đó.


1

Một kỹ thuật tôi sử dụng là một cái gì đó như sau. Xác định một biến toàn cục mà bạn có thể sử dụng cho một hoặc nhiều khối bắt thử tùy thuộc vào những gì bạn đang cố gắng gỡ lỗi và sử dụng cấu trúc sau:

if(!GlobalTestingBool)
{
   try
   {
      SomeErrorProneMethod();
   }
   catch (...)
   {
      // ... Error handling ...
   }
}
else
{
   SomeErrorProneMethod();
}

Tôi thấy điều này giúp tôi linh hoạt hơn một chút về mặt kiểm tra vì vẫn còn một số trường hợp ngoại lệ tôi không muốn IDE tiếp tục.


3
Đây là một kỹ thuật hữu ích - nó biến ngoại lệ được xử lý thành một ngoại lệ chưa được xử lý, do đó trình gỡ lỗi tự động dừng trên đó. Tôi không chắc tại sao nó bị hạ cấp, trừ khi đó là cách tốt nhất để đặt GlobalTestingBool của bạn. Một tùy chọn khác, có thể tốt hơn là sử dụng Debugger.IsAttached.
Joe White

Bạn sẽ phải thêm điều này xung quanh mỗi lần thử / bắt và biên dịch lại mã của bạn. Không hữu ích lắm nếu bạn đang trong quá trình gỡ lỗi một cái gì đó.
Tối đa

Một ngoại lệ nên được ném vào mã nếu có một điều kiện đặc biệt - một điều không thể chấp nhận được - và nó phải được bắt ở mức độ mà quyết định có thể được đưa ra về cách xử lý nó. Mã như thế này làm phức tạp các đường dẫn thực hiện.
Lee Oades

Tôi biết đây là câu trả lời thực sự cũ, nhưng đối với những người làm việc ngẫu nhiên như tôi, bạn chỉ cần thêmcatch(){/*handle or not*/ throw; } // throw without any exception specified will rethrow original exception with original callstack etc
Jan 'splite' K.

0

Các tài liệu trực tuyến có vẻ không rõ ràng, vì vậy tôi chỉ thực hiện một bài kiểm tra nhỏ. Việc chọn ngắt trên Thrown từ hộp thoại Exceptions khiến cho việc thực thi chương trình bị phá vỡ trên bất kỳ ngoại lệ nào , được xử lý hoặc xử lý. Nếu bạn chỉ muốn phá vỡ các ngoại lệ được xử lý, có vẻ như cách truy vấn duy nhất của bạn là duyệt qua mã của bạn và đặt các điểm dừng trên tất cả các ngoại lệ được xử lý của bạn. Điều này có vẻ hơi quá mức, vì vậy có thể tốt hơn để thêm một câu lệnh gỡ lỗi bất cứ khi nào bạn xử lý một ngoại lệ. Sau đó, khi bạn thấy đầu ra đó, bạn có thể đặt điểm dừng tại dòng đó trong mã.

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.