Nice programing

예외가 안전하게 처리 될 때 첫 번째 예외 메시지 방지

nicepro 2020. 10. 17. 12:23
반응형

예외가 안전하게 처리 될 때 첫 번째 예외 메시지 방지


다음 코드는 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 환경 설정에 따라 메뉴에 없을 수 있습니다. 사용자 지정 메뉴를 사용하여 메뉴에 추가하지 않는 경우)

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

"공용 언어 런타임 예외"줄에서 thrown을 선택 취소 할 수 있으며 (그러면 첫 번째 예외에 대해 방해하지 않아야 함) 원할 경우 User-unhandeled (권장하지 않음)를 선택 취소 할 수도 있습니다.

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"확인란을 선택하고 "user-handled"를 선택 취소합니다.
  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

This allows you to silence them as mentioned in other comments, but still makes sure you are able to be aware of them. I find it is good to see how many I am really throwing if I log a message and timestamp to a text file.


Actually if are having many exceptions per second, you would achieve must better performance by checking reader.EndOfStream-value.. Printing out those exception messages is unbelievably slow, and hiding them in visual studio won't speed up anything.


in VB.NET:

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

I think the stream is throwing this exception, so your try is scoped to narrow to catch it.

Add a few more try catch combos around the different scopes until you catch it where its actually being thrown, but it appears to be happening either at our outside of your using, since the stream object is not created in the using's scope.

참고URL : https://stackoverflow.com/questions/58380/avoiding-first-chance-exception-messages-when-the-exception-is-safely-handled

반응형