문제

다음 코드는 EOS 예외를 포착합니다.

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

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

그렇다면 콘솔에서 첫 번째 예외가 계속 발생하는 이유는 무엇입니까?

mscorlib.dll에서 'System.IO.EndOfStreamException' 유형의 첫 번째 예외가 발생했습니다.

이러한 첫 번째 예외 메시지를 숨기는 방법이 있습니까?

도움이 되었습니까?

해결책

"첫 번째" 예외의 요점은 예외가 발생하는 시점에서 디버깅하는 동안 중지할 수 있도록 사전 처리기를 확인한다는 것입니다."두 번째 기회" 예외는 적절한 처리기가 없는 예외입니다.누군가 예외를 포착하더라도 예외가 던져질 때 무슨 일이 일어나는지 확인하는 것이 중요하기 때문에 "최초의" 예외를 포착하고 싶을 때가 있습니다.

걱정할 것이 없습니다.이는 정상적인 동작입니다.

다른 팁

메시지를 보지 않으려면 출력 창을 마우스 오른쪽 버튼으로 클릭하고 "예외 메시지"를 선택 취소하세요.

그러나 중단점을 설정하고 디버거를 재구성하지 않고 예외가 발생하는 시기를 알고 싶다면 이러한 상황이 발생하는 것을 보는 것이 좋을 수 있습니다.

1) Visual Studio에서는 디버거가 예외를 처리(중단)하는 방식에 대한 설정을 변경할 수 있습니다.

디버그 > 예외로 이동합니다.(Visual Studio 환경 설정에 따라 메뉴에 이 항목이 없을 수도 있습니다.그렇지 않은 경우 사용자 정의 메뉴를 사용하여 메뉴에 추가하십시오.)

여기에는 예외 대화 상자와 예외 중단 시기가 표시됩니다.

"공용 언어 런타임 예외" 줄에서 throw된 항목을 선택 취소할 수 있으며(그러면 첫 번째 예외에 대해 귀찮게 하지 않아도 됩니다) 원할 경우 사용자 처리되지 않은 항목(권장하지 않음)을 선택 취소할 수도 있습니다.

2) 표시되는 메시지는 콘솔에 표시되어서는 안 되며 Visual Studio의 '출력' 창에 표시되어야 합니다.후자의 경우 제거할 가능성을 찾지 못했지만 Visual Studio 없이 앱을 실행하면 나타나지 않습니다.

도움이 되길 바랍니다.

Java와 달리 .NET 예외는 처리 성능 측면에서 상당히 비용이 많이 들기 때문에 정상적이고 성공적인 실행 경로에서는 처리된 예외를 피해야 합니다.

콘솔 창의 혼잡함을 피할 수 있을 뿐만 아니라 성능이 향상되고 .NET CLR 예외와 같은 성능 카운터가 더욱 의미있게 됩니다.

이 예에서는 다음을 사용합니다.

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

이 문제가 발생하여 예외가 발생한 위치를 알 수 없습니다.그래서 내 해결책은 Visual Studio가 이런 종류의 예외에 대한 실행을 중지하도록 하는 것이었습니다.

  1. "디버그/예외"로 이동합니다.
  2. "공용 언어 런타임 예외" 트리를 확장합니다.
  3. "시스템" 분기를 확장합니다.
  4. "NullReferenceException"이있는 위치로 스크롤하고 "Throw"Checkbox를 확인하고 "사용자 처리"를 선택 취소하십시오.
  5. 프로젝트를 디버그하세요.

이러한 메시지를 더 효과적으로 제어하려면 핸들러를 추가하면 됩니다.

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

이렇게 하면 다른 댓글에서 언급한 것처럼 해당 내용을 침묵시킬 수 있지만 여전히 해당 내용을 인식할 수 있습니다.메시지와 타임스탬프를 텍스트 파일에 기록하면 내가 실제로 얼마나 많이 던지는지 확인하는 것이 좋습니다.

실제로 초당 많은 예외가 발생하는 경우 reader.EndOfStream-value를 확인하여 더 나은 성능을 얻을 수 있습니다.이러한 예외 메시지를 인쇄하는 것은 믿을 수 없을 정도로 느리고 Visual Studio에 숨겨도 속도가 빨라지지 않습니다.

VB.NET에서:

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

스트림에서 이 예외가 발생하는 것 같으므로 이를 포착하기 위해 노력 범위를 좁혀야 합니다.

실제로 던져지는 위치를 잡을 때까지 다른 범위 주위에 콤보를 몇 개 더 추가해 보세요. 그러나 스트림 개체가 사용 범위에서 생성되지 않기 때문에 사용 외부에서 발생하는 것으로 보입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top