Visual Studio 2015 lỗi về các trường hợp ngoại lệ không được khắc phục không hoạt động


114

Visual studio từng có một hộp kiểm cụ thể để "Phá vỡ ngoại lệ chưa được xử lý". Vào năm 2015, điều này đã bị xóa (hoặc chuyển đi đâu đó mà tôi không thể tìm thấy). Vì vậy, bây giờ các dự án đã chuyển đổi của tôi không còn bị phá vỡ nếu tôi không cung cấp trình xử lý ngoại lệ cấp người dùng. Tôi không muốn phá vỡ tất cả "trường hợp ngoại lệ được ném ra" bởi vì tôi xử lý những trường hợp cụ thể. Chỉ là nơi tôi không cung cấp một trình xử lý cụ thể.

Ngay bây giờ mã của tôi chỉ cần thoát khỏi thủ tục hiện tại và tiếp tục thực hiện ở vị trí ngăn xếp cuộc gọi tiếp theo, KHÔNG TỐT.

Có ai biết cách lấy lại điều này trong Visual Studio 2015 không? Tôi vừa nâng cấp lên phiên bản cộng đồng ngày hôm qua.


Visual Studio 2015 sẽ giữ bố cục hiện tại từ phiên bản trước của bạn, nếu nó không có Toolhoặc Windowtab sẽ có tất cả các vị trí mong muốn. Trong trường hợp của bạn, bạn đang tìm Cài đặt Ngoại lệ .
Greg

4
@greg, không phải là tôi không biết tìm bảng điều khiển ở đâu. Mối quan tâm của tôi là hành vi tôi đang tìm kiếm không có trong bảng điều khiển đó.
Ted Lowery,

cùng một vấn đề ở đây. Trong trường hợp của chúng tôi, chúng tôi mong đợi một sự phá vỡ ngoại lệ khi tự động lấy nét không có tất cả các loại được đăng ký. Sử dụng cùng một giải pháp với vs2013 nó hoạt động, trong vs2015 chúng tôi không nhận được gì. đây cũng là một vấn đề với đăng ký của bên thứ ba khác và các ngoại lệ (như nservicebus) .Tôi ngạc nhiên nếu nó chỉ là trường hợp cho dự án tạo ra trong vs2013 và ran trong vs2015
Choco Smith

3
Cửa sổ công cụ mới đó thực sự hấp dẫn.
cedd

Theo Phân loại ngoại lệ của MS nếu bạn đã xử ngoại lệ, nó luôn phá vỡ trình gỡ lỗi. Có thể bạn phải kiểm tra tùy chọn "Break khi excptions vượt qua AppDomain ..." trong danh sách "Options -> Debugging -> General".
tsul

Câu trả lời:


118

Có một cửa sổ mới được gọi là "Cài đặt ngoại lệ" xuất hiện ở ngăn dưới bên phải theo mặc định khi bạn bắt đầu gỡ lỗi. Nó có tất cả các tùy chọn mà bạn mong đợi.

Bạn có thể đưa nó lên với CTRL+ ALT+E

Điều này cho phép bạn chọn ngoại lệ nào gây ra lỗi trong trình gỡ lỗi.

Tuy nhiên, điều quan trọng là bạn cũng có thể đặt liệu các ngoại lệ này luôn luôn phá vỡ hay chỉ phá vỡ khi đó là một ngoại lệ chưa được xử lý - nhưng việc đặt điều này không trực quan cho lắm.

Trước tiên, bạn sẽ cần kiểm tra "Bật mã chỉ của tôi" trong Công cụ> Tùy chọn> Gỡ lỗi.

Sau đó, điều này cho phép bạn nhấp chuột phải vào tiêu đề cột (Break When Thrown) trong cửa sổ Cài đặt ngoại lệ mới và thêm cột "Hành động bổ sung", sau đó cho phép bạn đặt từng ngoại lệ là "Tiếp tục khi chưa xử lý trong mã người dùng".

Vì vậy, chỉ cần nhấp chuột phải vào một ngoại lệ hoặc toàn bộ nhóm và tắt cờ "Tiếp tục khi không được xử lý trong mã người dùng". Thật không may, cột "Tác vụ bổ sung" sẽ hiển thị trống giống với cột "Ngắt khi chưa xử lý trong mã người dùng".

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

Thêm về điều này ở đây:

http://blogs.msdn.com/b/visualstudioalm/archive/2015/02/23/the-new-exception-settings-window-in-visual-studio-2015.aspx


7
Thực ra cửa sổ đó chỉ có tùy chọn "break with throw". Đó không phải là điều tôi muốn. Tôi muốn "phá vỡ khi được xử lý".
Ted Lowery,

17
Và đó là vấn đề. Nó KHÔNG phá vỡ. như tôi đã nói ở trên, nó thoát (bước ra) khỏi cuộc gọi thủ tục hiện tại và chỉ bắt đầu thực hiện dòng mã tiếp theo trong thủ tục gọi.
Ted Lowery,

2
và tôi đã bật "Just My Code".
Ted Lowery,

19
@TomStudee Tôi cũng gặp vấn đề tương tự. Điều tôi muốn là "Break khi không được xử lý" nhưng những gì tôi nhận được là "Break khi bị ném". Câu hỏi là: làm thế nào để có được "Break khi được xử lý"?
ogggre

1
@TomStudee Tôi vừa thêm một số thông tin làm rõ rất cần thiết, vì bạn đã thiếu cài đặt khóa cho phép bạn đặt các ngoại lệ để chỉ ngắt khi được xử lý.
Jerad Rose

36

Tôi đã gặp vấn đề tương tự và tôi đã giải quyết được điều này bằng cách thực hiện điều này -

  1. Nhấn Ctrl+ Alt+ eđể hiển thị cửa sổ Cài đặt ngoại lệ .
  2. Đánh dấu vào Ngoại lệ thời gian chạy ngôn ngữ chung . nhập mô tả hình ảnh ở đây

Đó là nó!

Tôi đã lấy cảm hứng từ bài đăng này vì tôi đang sử dụng phiên bản x64 của Windows .


7
Điều đó sẽ khiến nó bị hỏng trên tất cả các ngoại lệ, ngay cả những ngoại lệ được xử lý bởi mã người dùng.
carlin.scott

1
@ carlin.scott, tôi tin rằng bạn có thể bỏ chọn thủ công các ngoại lệ được xử lý khỏi danh sách.
Justin XL

6
@JustinXL Vấn đề là, đây là danh sách theo loại ngoại lệ, không phải do nó được xử lý hay không. Ví dụ, có những lúc System.ArgumentExceptionđược xử lý và những lúc thì không. Tôi chỉ quan tâm đến việc phá vỡ khi nó không được xử lý.
Jerad Rose

1
@JeradRose Trình gỡ lỗi sẽ luôn bị phá vỡ khi một ngoại lệ không được xử lý. Vì vậy, như tôi đã nói, nếu bạn không muốn ngắt các ngoại lệ đã xử lý, chỉ cần bỏ chọn các loại ngoại lệ đó khỏi danh sách Break When Thrown .
Justin XL

Ngay cả khi kiểm tra tất cả mọi thứ nó không phá vỡ trên một ngoại lệ: / chỉ thoát
Douglas Gaskell

10

Đối với những người quản lý muốn phá vỡ chỉ khi ngoại lệ liên quan đến mã của họ, có một tùy chọn trong Visual Studio 2015: Tùy chọn-> Gỡ lỗi-> Chung-> Chỉ Mã của tôi. Sau khi được chọn, nó cho phép không bị vỡ khi ngoại lệ được quản lý (ném và bắt) bên ngoài mã của bạn.


Điều này đã cứu tôi cho một tình huống khác trong đó VS2015 do một số lý do từ chối nhập một số mã. Mã là "của tôi" nhưng có thứ gì đó đã kích hoạt cờ "Chỉ là mã của tôi". Tôi đoán có lỗi ở đâu đó khi chạy 2 phiên bản VS và một máy chủ web độc lập và có thể là một số lỗi khác.
LosManos

9

Microsoft đã thay đổi logic một cách tinh vi trong cửa sổ ngoại lệ mới.

Xem http://blogs.msdn.com/b/visualstudioalm/archive/2015/02/23/the-new-exception-settings-window-in-visual-studio-2015.aspx

Phần quan trọng là:

Ghi chú quan trọng

  • Cửa sổ mới này chứa tất cả các chức năng giống như hộp thoại phương thức cũ. Không có khả năng nào của trình gỡ lỗi chỉ thay đổi cách bạn có thể truy cập chúng
  • Trình gỡ lỗi sẽ luôn bị phá vỡ khi một ngoại lệ được xử lý
  • Cài đặt để thay đổi nếu trình gỡ lỗi không tuân theo các trường hợp ngoại lệ do người dùng xử lý đã di chuyển trong menu ngữ cảnh
  • Vị trí menu đã chuyển đến Gỡ lỗi -> Windows -> Cài đặt ngoại lệ

Tuy nhiên , nếu giống như tôi, bạn có Trình xử lý ngoại lệ không xử lý toàn cầu trong mã của mình thì mục thứ hai trong danh sách đó là chìa khóa: Đối với tôi, không có ngoại lệ nào sẽ thực sự được xử lý, điều này có vẻ khác với VS2013.

Để lấy lại hành vi trong đó VS ngắt trên các ngoại lệ chưa được xử lý, tôi phải đánh dấu vào tất cả các loại ngoại lệ mà tôi muốn phá vỡ và sau đó đảm bảo rằng "Tùy chọn bổ sung" (bạn có thể cần hiển thị cột này *) cho "Tiếp tục khi không được xử lý trong mã người dùng " KHÔNG được đặt. Logic VS2015 dường như không coi Trình xử lý ngoại lệ không được xử lý toàn cầu của tôi là "được xử lý trong mã người dùng", vì vậy nó thực sự bị hỏng trên những điều này; nó không bị phá vỡ trên các ngoại lệ bắt được mặc dù. Điều này làm cho nó hoạt động như VS2013 đã làm.

* Cách bật cột "Hành động bổ sung" * Cách bật cột "Hành động bổ sung"


2
Điều này không hoạt động chính xác như VS2013 vì nó sẽ phá vỡ các trường hợp ngoại lệ do người dùng xử lý với các cài đặt bạn đã đề xuất, điều này đã không xảy ra trước đây.
carlin.scott

Làm cách nào để hiển thị cột "Tùy chọn bổ sung"?
UuDdLrLrSs 21/03/18

@DaveInCaz Nhấp chuột phải vào tiêu đề cột> "Hiển thị cột"> "Tác vụ bổ sung"
nestoda

7

Nếu tôi đang đọc chính xác giữa các dòng ở đây, vấn đề là ngoại lệ của bạn đang 'biến mất' một cách hiệu quả mặc dù hành vi trình gỡ lỗi mặc định sẽ phá vỡ trên các ngoại lệ không được xử lý.

Nếu bạn có các phương thức không đồng bộ, bạn có thể gặp phải sự cố này vì các ngoại lệ không bắt được trên luồng nhóm luồng như một phần của phần tiếp tục Tác vụ không được coi là ngoại lệ chưa được xử lý. Đúng hơn, chúng được nuốt và lưu trữ cùng với Task.

Ví dụ: hãy xem mã này:

class Program
{
    static void Main(string[] args)
    {
        Test();
        Console.ReadLine();
    }

    private async static Task Test()
    {
        await Task.Delay(100);
        throw new Exception("Exception!");
    }
}

Nếu bạn chạy chương trình này với cài đặt trình gỡ lỗi mặc định (chỉ dừng ở các trường hợp ngoại lệ chưa được khắc phục), trình gỡ lỗi sẽ không bị hỏng. Điều này là do luồng nhóm luồng được phân bổ cho phần tiếp theo nuốt ngoại lệ (chuyển nó đến cá thể Tác vụ) và tự giải phóng trở lại nhóm.

Lưu ý rằng, trong trường hợp này, vấn đề thực sự là hàng Tasktrả về Test()không bao giờ được kiểm tra. Nếu bạn có các loại logic 'fire-and-forget' tương tự trong mã của mình, thì bạn sẽ không thấy các ngoại lệ tại thời điểm chúng được ném (ngay cả khi chúng được 'xử lý' bên trong phương thức); ngoại lệ chỉ hiển thị khi bạn quan sát Tác vụ bằng cách chờ nó, kiểm tra Kết quả của nó hoặc xem xét rõ ràng Ngoại lệ của nó.

Đây chỉ là phỏng đoán, nhưng tôi nghĩ có khả năng bạn đang quan sát điều gì đó như thế này.


Mặc dù điều này có thể không liên quan đến vấn đề của op nhưng nêu ra một điểm rất tốt về các ngoại lệ được nêu ra trong các quy trình không đồng bộ.
Phil Cooper

Có cách nào để làm cho trình gỡ lỗi dừng lại mặc dù ngoại lệ được lưu trữ như vậy không?
Lucas

@Lucas, Tôi không biết điều đó, mặc dù bạn có thể kết thúc với một số thay đổi mã. Nếu nội dung phương thức fire-and-forget của bạn có khối try-catch, bạn có thể thêm một Debugger.Break()lệnh gọi rõ ràng . Cách khác, bạn có thể thêm một rõ ràng Debugger.Break()trong TaskScheduler.UnobservedTaskExceptionxử lý, tuy nhiên nhược điểm ở đây là điều này có thể bắn nhiều muộn hơn ngoại lệ ban đầu, vì nó xảy ra trên thread finalizer khi Task được dọn dẹp. Nói chung, bạn nên cố gắng luôn quan sát kết quả Nhiệm vụ hoặc ít nhất là có một khối thử bắt để ghi nhật ký vào thời điểm thất bại.
Dan Bryant

3

Theo kinh nghiệm của tôi, các cài đặt ngoại lệ trong năm 2015 sẽ bị loại bỏ hoàn toàn nếu bạn thay đổi bất kỳ điều gì.

Kỳ vọng rằng nếu bạn cho đến khi nhóm mẹ "CLR" thì bạn sẽ không nhận được bất kỳ thực thi vi phạm nào cho việc xử lý. Bạn sẽ luôn phá vỡ nếu một ngoại lệ không được giải quyết. Tuy nhiên, nếu bạn chưa chọn nhóm CLR, mã bên trong try ... catch đơn giản sẽ không gây ra lỗi. Đó không phải là tình huống.

Giải pháp: Trong hộp công cụ cài đặt ngoại lệ mới, nhấp chuột phải và chọn "khôi phục mặc định". Taadaaaa ... Nó hoạt động bình thường trở lại. Bây giờ đừng vặn với nó.


1

Hãy thử làm theo hướng dẫn:

  1. Trong cửa sổ Cài đặt Ngoại lệ, mở menu ngữ cảnh bằng cách bấm chuột phải vào cửa sổ, sau đó chọn Hiển thị Cột. (Nếu bạn đã tắt Just My Code, bạn sẽ không thấy lệnh này.)
  2. Bạn sẽ thấy cột thứ hai có tên là Hành động bổ sung. Cột này hiển thị Tiếp tục khi được mã người dùng xử lý theo các ngoại lệ cụ thể, có nghĩa là trình gỡ lỗi không bị hỏng nếu ngoại lệ đó không được xử lý trong mã người dùng mà được xử lý trong mã bên ngoài.
  3. Bạn có thể thay đổi cài đặt này đối với một ngoại lệ cụ thể (chọn ngoại lệ, nhấp chuột phải và chọn / bỏ chọn Tiếp tục khi chưa được xử lý trong Mã người dùng) hoặc cho toàn bộ danh mục ngoại lệ (ví dụ: tất cả các ngoại lệ Thời gian chạy ngôn ngữ chung).

https://msdn.microsoft.com/en-us/library/x85tt0dd.aspx


Hoàn toàn đồng ý. Thật là tệ khi không hiển thị cột này theo mặc định. Đã dành nhiều thời gian để tìm thấy nó. Ngoài ra, " ngoại lệ người dùng không được xử lý " nghĩa là gì khá rõ ràng. Tôi đã có trình xử lý của mình về việc hủy bỏ Nhiệm vụ (tương tự như vậy try { task.Wait(); } catch { ... }) và OperationCanceledException trong tác vụ được coi là không được xử lý trong mã người dùng bằng cách nào đó.
tsul

1

Tất cả đều hơi khó hiểu và theo ý kiến ​​của tôi là không tốt bằng hộp thoại ngoại lệ cũ, nhưng dù sao.

Nếu một ngoại lệ nằm trong danh sách và được đánh dấu thì trình gỡ lỗi sẽ phá vỡ bất cứ khi nào ngoại lệ được ném ra.

Nếu một ngoại lệ không được chọn hoặc không có trong danh sách thì trình gỡ lỗi sẽ chỉ phá vỡ khi loại ngoại lệ đó được người dùng xử lý.

Ví dụ: trong ảnh chụp màn hình bên dưới, trình gỡ lỗi sẽ phá vỡ bất cứ khi nào a System.AccessViolationExceptionđược ném ra, nhưng đối với tất cả các ngoại lệ khác, nó sẽ chỉ phá vỡ nếu ngoại lệ được người dùng xử lý.

Cửa sổ công cụ ngoại lệ Visual Studio 2015


1

Khi tôi nâng cấp lên VS2015, tôi cũng gặp vấn đề trong đó các ngoại lệ được sử dụng để "phá vỡ" ứng dụng, nhưng hiện đã được bỏ qua và được chuyển ngay. Đôi khi chúng ta muốn mã của mình cố ý ném các ngoại lệ vào những nơi mà chúng ta muốn mã dừng lại, thay vì tiếp tục. Chúng tôi luôn sử dụng cụm từ Throw New Exception("Message")lấy mã của mình để cố tình phá vỡ:

    If SomethingReallyBad = True Then
        Throw New Exception("Something Really Bad happened and we cannot continue.")
    End If

Với VS2015, "System.Exception" cổ điển là những gì được đưa ra khi chúng ta nói Throw New Exception. Do đó, chúng tôi cần kiểm tra đánh dấu "System.Exception" trong Cài đặt ngoại lệ mới:

Kiểm tra hộp System.Exception

Sau khi kiểm tra, mã của chúng tôi đã hoạt động như mong đợi.


1

Giải pháp là về mặt ngữ nghĩa, điều này ngược lại với những gì bạn nghĩ rằng bạn đang thiết lập. Bạn cần đảm bảo rằng Tiếp tục khi unhandled trong mã người dùng được không được kích hoạt tức là không được chọn như hình dưới Actions bổ sung cột trong các thiết lập ngoại lệ tab - xem dưới đây:

bạn đang nói một cách hiệu quả là không tiếp tục (tức là ngắt) khi không được xử lý trong mã

Cửa sổ Cài đặt Ngoại lệ (Control + Alt + E)

Để làm điều này:

  1. Nhấp chuột phải vào ngoại lệ hoặc tập hợp các ngoại lệ mà bạn quan tâm (tức là thường là dòng trên cùng 'Ngoại lệ thời gian chạy ngôn ngữ chung' trong cây)
  2. Chọn tùy chọn Tiếp tục khi chưa được xử lý trong Mã người dùng (xem bên dưới)
  3. Đảm bảo rằng các ngoại lệ không được chọn (xem bên dưới)
  4. tiếp tục gỡ lỗi

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

Điều đó đã làm điều đó cho tôi - hạnh phúc một lần nữa.

Đây là trong VS 2015


0

Chắc chắn có một số lỗi trong Visual Studio có thể khiến nó bị kẹt và yêu cầu khởi động lại. Ngay cả VS2015.

Tôi đã gặp một tình huống luồng duy nhất trong đó a NullReferenceExceptionbị bắt bởi một trình xử lý 'bên ngoài' (vẫn còn trong mã của tôi) mặc dù tôi đã yêu cầu nó phá vỡ khi nó được nâng lên.

Tôi nhận ra đây là một ngoại lệ 'đã xử lý' và bạn đang nói một ngoại lệ 'chưa được xử lý' - tuy nhiên tôi khá chắc chắn rằng đôi khi khởi động lại nhanh VS sẽ khắc phục được điều này, nếu IISRESET không.


0

Visual Studio 2017 hoạt động tốt với xử lý lỗi. Mặt khác, Visual Studio 2015 khó xử lý lỗi với các tác vụ vì trong chế độ gỡ lỗi, tất cả các trường hợp ngoại lệ xảy ra trong một tác vụ không đồng bộ đều bị bắt nhưng nếu tôi bước qua nó sẽ bị treo vô thời hạn. Nếu được thực thi mà không gỡ lỗi, nó sẽ treo vô thời hạn mà không có ngoại lệ nào bị bắt !!! Tôi yêu thích studio trực quan và đã sử dụng nó từ năm 1995 và năm 2015 là phiên bản tồi tệ hơn cho đến nay mặc dù tôi đã chuyển trực tiếp từ năm 2010 sang năm 2015. Tôi đã dành 8 giờ để cố gắng xử lý ngoại lệ này nhưng không thành công. Tôi đã sao chép mã chính xác sang 2017 trên máy tính tại nhà của mình và nó hoạt động hoàn hảo. Tôi rất khó chịu khi Microsoft đẩy các tác vụ vào một khuôn khổ mà trình biên dịch 2015 không thể xử lý chính xác.

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.