[c#] throw 및 catch 될 때 해당 예외에서 디버거를 중지하지 마십시오.

도구 / 예외에서 예외가 발생하면 디버거가 중지하는 옵션을 설정했습니다. 잡혔는 지 여부.

해당 규칙의 예외를 어떻게 제외합니까? 내 코드 어딘가에 프로그램 논리의 일부인 예외가 발견되었습니다. 그래서 나는 분명히 그 예외가 그것이 맞을 때마다 디버거를 중지시키는 것을 원하지 않습니다.

예 : 344 행에서 잡힌 nullreference 예외를 무시하고 싶습니다. 다른 모든 예외에서 멈추고 싶어



답변

내가 올바르게 기억하면 DebuggerStepThrough예외가 발생하지 않도록 코드가 포함 된 메서드에 속성을 사용할 수 있습니다 . 성가신 예외를 발생시키는 코드를 메서드에서 분리하고 속성으로 장식 할 수 있다고 가정합니다.


답변

DebuggerHidden 당신의 친구입니다!

공용 언어 런타임은이 특성에 의미 체계를 연결하지 않습니다. 소스 코드 디버거에서 사용하도록 제공됩니다. 예를 들어 Visual Studio 2005 디버거는이 특성으로 표시된 메서드에서 중지되지 않으며 메서드에서 중단 점을 설정할 수 없습니다. Visual Studio 2005 디버거에서 인식하는 다른 디버거 특성은 DebuggerNonUserCodeAttribute 및 DebuggerStepThroughAttribute입니다.

VS2010에서 테스트되었으며 훌륭하게 작동합니다.

DebuggerStepThrough특정 디버거 버전에서도 작동 하는 것처럼 보이지만 DebuggerHidden두 답변에 대한 주석을 기반으로 더 광범위한 상황에서 작동하는 것 같습니다.

두 옵션 모두 현재 반복기 블록 메서드 또는 async / await 메서드 에서 작동하지 않습니다 . 이 문제는 이후 Visual Studio 업데이트에서 수정 될 수 있습니다.


답변

DebuggerStepThrough는 try / catch가있는 메서드에서 디버거가 중단되는 것을 방지하는 데 사용되는 것입니다.

그러나 Visual Studio의 디버깅 옵션 (메뉴 도구 / 옵션, 노드 디버깅 / 일반)의 일반 설정에서 “내 코드 만 사용 (관리 전용)”옵션을 선택 취소하지 않은 경우에만 작동합니다.

http://abhijitjana.net/2010/09/22/tips-on-debugging-using-debuggerstepthrough-attribute/의 해당 속성에 대한 자세한 정보

DebuggerHidden은 단순히 디버거가 예외가 발생한 메서드를 표시하지 못하게합니다. 대신 해당 속성으로 표시되지 않은 스택의 첫 번째 메소드를 표시합니다.


답변

다른 답변에 지정된 특성 (및 DebuggerNonUserCode특성 과 같은 다른 특성)은 더 이상 Visual Studio 2015에서 기본적으로 동일한 방식으로 작동하지 않습니다. 디버거는 이전 버전의 VS와 달리 해당 특성을 사용하는 메서드 시장의 예외에서 중단됩니다. 동작을 변경 한 성능 향상을 끄려면 레지스트리 설정을 변경해야합니다.

reg add HKCU\Software\Microsoft\VisualStudio\14.0_Config\Debugger\Engine /v AlwaysEnableExceptionCallbacksOutsideMyCode /t REG_DWORD /d 1

자세한 내용은 Visual Studio 블로그 에서 찾을 수 있습니다 .

(이것은 아마도 최상위 답변에 대한 의견이어야하지만 충분한 담당자가 없습니다)


답변

코드의 특정 위치에서 발생한 예외를 구분할 수 없습니다. 그러나 특정 유형의 예외를 비활성화 할 수 있습니다.

자신의 코드가 문제의 예외를 throw하는 경우 적합한 모든 항목에서 파생 된 사용자 지정 예외로 만든 다음이 파생 형식에서 디버그 중단을 비활성화합니다.

NullReferenceException으로 시스템 예외를 비활성화하면 전체 시스템에 영향을 미치므로 개발 중에 바람직하지 않습니다.

예외에는 두 가지 종류의 중단 동작이 있습니다.

  • Throw : 선택하면이 유형의 예외가 발생하는 즉시 중단됩니다.
  • 사용자 처리되지 않음 :이 옵션을 선택하면이 유형의 예외가 try / catch에서 처리되지 않는 경우에만 중단됩니다.

NullReferenceException에 대한 ‘Thrown’검사를 제거하면 시스템이 코드에서 문제의 줄을 전달할 때마다 중단되지 않는 이점이 있지만 다른 부분에서 처리되지 않은 NullReference 예상이 발생하면 중단됩니다. 체계.


답변