Câu hỏi Tránh các thông báo ngoại lệ cơ hội đầu tiên khi ngoại lệ được xử lý an toàn


Đoạn mã sau đây bắt được ngoại lệ của EOS

using (var reader = new BinaryReader(httpRequestBodyStream)) {

    try {
        while (true) {
            bodyByteList.Add(reader.ReadByte());
        }
    } catch (EndOfStreamException) { }
}

Vậy tại sao tôi vẫn nhận được ngoại lệ cơ hội đầu tiên trong bảng điều khiển của mình?

Một ngoại lệ cơ hội đầu tiên của loại 'System.IO.EndOfStreamException' xảy ra trong mscorlib.dll

Có cách nào để ẩn các thông báo ngoại lệ cơ hội đầu tiên này không?


75
2017-09-12 05:48


gốc




Các câu trả lời:


Điểm ngoại lệ của "cơ hội đầu tiên" là bạn đang thấy họ xử lý trước để bạn có thể dừng lại trong khi gỡ lỗi tại thời điểm ném. Ngoại lệ "cơ hội thứ hai" là ngoại lệ không có trình xử lý thích hợp. Đôi khi bạn muốn nắm bắt ngoại lệ "cơ hội đầu tiên" bởi vì điều quan trọng là phải xem điều gì đang xảy ra khi nó bị ném, ngay cả khi ai đó đang bắt nó.

Không có gì để quan tâm. Đây là hành vi bình thường.


78
2017-09-12 05:56



Thật vậy, nó là không có gì để được quan tâm, nhưng họ làm lộn xộn lên các bản ghi đầu ra gỡ lỗi: ( - Dimitri C.


Để tránh nhìn thấy tin nhắn, nhấp chuột phải vào cửa sổ đầu ra và bỏ chọn "Thông báo ngoại lệ".

Tuy nhiên, nhìn thấy chúng xảy ra có thể là tốt đẹp, nếu bạn quan tâm đến việc biết khi nào ngoại lệ được ném mà không cần thiết lập các điểm ngắt và cấu hình lại trình gỡ rối.


189
2017-09-13 18:48



Tên chính xác là "Thông điệp ngoại lệ". Cảm ơn bạn đã trả lời phần thứ hai của câu hỏi. - StriplingWarrior


1) Trong Visual Studio, bạn có thể thay đổi các thiết lập cho cách Debugger xử lý (ngắt) ngoại lệ.

Đi tới Gỡ lỗi> Ngoại lệ. (Lưu ý điều này có thể không có trong menu của bạn tùy thuộc vào thiết lập Visual Studio Environment của bạn. Nếu không chỉ cần thêm nó vào menu của bạn bằng cách sử dụng menu Customize.)

Ở đó bạn được trình bày với một hộp thoại của trường hợp ngoại lệ và khi nào để phá vỡ chúng.

Trong dòng "Common Language Runtime Exceptions" bạn có thể bỏ chọn ném (mà sau đó sẽ ngừng làm phiền bạn về ngoại lệ cơ hội đầu tiên) và bạn cũng có thể bỏ chọn User-unhandeled (mà tôi sẽ không khuyên) nếu muốn.

2) Thông điệp bạn đang nhận không được trong giao diện điều khiển, nhưng sẽ xuất hiện trong cửa sổ 'Đầu ra' của Visual Studio. Nếu sau này là trường hợp, sau đó tôi đã không tìm thấy một khả năng để loại bỏ điều đó, nhưng nó không xuất hiện nếu bạn chạy các ứng dụng mà không có Visual Studio.

Hy vọng rằng sẽ giúp.


19
2017-09-12 06:06





Không giống như Java, ngoại lệ .NET khá tốn kém về sức mạnh xử lý và các ngoại lệ được xử lý nên tránh trong đường dẫn thực hiện thông thường và thành công.

Không chỉ bạn sẽ tránh lộn xộn trong cửa sổ giao diện điều khiển, nhưng hiệu suất của bạn sẽ cải thiện, và nó sẽ làm cho quầy hiệu suất như .NET CLR ngoại lệ có ý nghĩa hơn.

Trong ví dụ này, bạn sẽ sử dụng

while (reader.PeekChar() != -1)
{
    bodyByteList.Add(reader.ReadByte());
}

11
2017-09-12 06:32



hoặc bạn có thể nhận được tất cả các byte trong một shot với ReadBytes và cũng sử dụng bộ đệm. nhưng tôi đoán đó không phải là câu hỏi. - Craig Tyler
Không trả lời câu hỏi - André Chalella
Chắc chắn rồi. "Có cách nào để giấu những thông điệp ngoại lệ cơ hội đầu tiên này không?" - ngoại lệ cơ hội đầu tiên sẽ không xuất hiện với vòng lặp này. :) - loudej


Tôi đã có vấn đề này và không thể tìm ra nơi ngoại lệ đã được ném. Vì vậy, giải pháp của tôi là để cho phép Visual Studio ngừng thực hiện loại ngoại lệ này.

  1. Điều hướng đến "Gỡ lỗi / Ngoại lệ"
  2. Mở rộng cây "Common Language Runtime Exceptions".
  3. Mở rộng nhánh "Hệ thống".
  4. Cuộn xuống vị trí "NullReferenceException" và kiểm tra "ném" hộp kiểm và bỏ chọn "do người dùng xử lý".
  5. Gỡ lỗi dự án của bạn.

7
2017-10-26 11:32





Nếu bạn muốn kiểm soát nhiều hơn các thư này, bạn có thể thêm trình xử lý:

Friend Sub AddTheHandler()
AddHandler AppDomain.CurrentDomain.FirstChanceException, AddressOf FirstChanceExceptionHandler
End Sub

<Conditional("DEBUG")>
Friend Sub FirstChanceExceptionHandler( source As Object,  e As Runtime.ExceptionServices.FirstChanceExceptionEventArgs)
' Process first chance exception

End Sub

Điều này cho phép bạn im lặng chúng như đã đề cập trong các bình luận khác, nhưng vẫn đảm bảo bạn có thể nhận thức được chúng. Tôi thấy nó là tốt để xem có bao nhiêu tôi thực sự ném nếu tôi đăng nhập một tin nhắn và dấu thời gian vào một tập tin văn bản.


4
2018-04-18 18:16



Gợi ý tốt. Nhưng đáng chú ý là System.Runtime.ExceptionServices chỉ có sẵn trong .Net 4.0 hoặc cao hơn. Đối với những người trong chúng ta đối phó với mã di sản được viết chống lại .Net 3.5 (hoặc cũ hơn). - paulsm4
Có giá trị cho ASP.NET ? - Kiquenet


Trên thực tế, nếu có nhiều ngoại lệ mỗi giây, bạn sẽ đạt được hiệu suất tốt hơn bằng cách kiểm tra reader.EndOfStream-value .. In ra các thông báo ngoại lệ đó là không thể tin được, và ẩn chúng trong studio trực quan sẽ không tăng tốc.


2
2018-05-09 21:49





trong VB.NET:

<DebuggerHidden()> _
Public Function Write(ByVal Text As String) As Boolean
   ...

-1
2017-08-07 21:23



Điều này không liên quan gì đến câu hỏi. - John Saunders
Trên thực tế, sử dụng [DebuggerNonUserCode] làm ẩn các thông báo "ngoại lệ cơ hội đầu tiên". Tôi sẽ không ngạc nhiên khi DebuggerHidden cũng làm điều này. - Ruben
Tôi không chắc chắn nếu chúng được coi là ngoại lệ, nhưng [DebuggerNonUserCode] sẽ không ẩn bất kỳ "Trợ lý gỡ lỗi được quản lý". Ví dụ, tôi nhận được BindingFailures khi tôi sử dụng XmlSerializer, và tôi vẫn chưa tìm thấy một cách để ẩn nó, khác hơn là bỏ chọn BindingFailure khi Thrown từ hộp thoại Exceptions. - Anthony Brien
Dường như sử dụng DebuggerHiddenAttribute chỉ có nghĩa là ngoại lệ cơ hội đầu tiên sẽ được hiển thị trên phương thức gọi, thay vì chính phương thức đó. - Thorarin


Tôi nghĩ rằng luồng này đang ném ngoại lệ này, do đó, thử của bạn bị thu hẹp để thu hẹp.

Thêm một vài thử cố gắng bắt combo xung quanh các phạm vi khác nhau cho đến khi bạn bắt nó thực sự được ném, nhưng nó dường như đang xảy ra hoặc ở bên ngoài của bạn sử dụng, kể từ khi đối tượng dòng không được tạo ra trong phạm vi sử dụng.


-4
2017-09-12 05:50