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


91

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

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

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


6
이 예외가 프로그래밍 논리의 일부인 경우 (정말 이런 방식으로 구현해야하는 경우 생각해보십시오)-최소한 자체 생성 된 파생 예외 여야합니다. 이렇게하면 Brian의 솔루션을 적용 할 수 있습니다.
tanascius

여기에 문제가 있습니다. stackoverflow.com/questions/1957907/…
MichaelD

2
@tanascius-+1 대부분의 경우에 동의합니다 예외는 논리적 결정에 대한 최선의 방법이 아닙니다. 그러나 예외 처리를 역 직렬화하는 것과 같은 일부 경우에는 때때로 불가피하므로 throw> catch> handle이 유일한 합리적인 옵션입니다.
jpierson

2
@Ando 미안해. 한 번에 여러 탭을 조정하는 것은 효율적이지만 항상 정확하지는 않습니다.

2
@tanascius : 응답에서 고유 한 예외를 발생시키기 전에 알려진 프레임 워크 예외를 포착해야 할 수도 있습니다. 귀하의 제안이 항상 가능한 것은 아닙니다.
댄 Puzey

답변:


40

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


31
malinger의 대답과 내 경험에 따르면이 대답은 잘못된 것 같습니다. DebuggerStepThrough속성은 첫 번째 예외로 디버거의 동작에 영향을주지 않습니다.
Michael Petrotta

5
@ 팀, 테스트했는데 중단되지 않습니다. 내 대답을 확인하십시오 : stackoverflow.com/questions/1420390/3455100#3455100
Shimmy Weitzhandler

1
+1은 순수한 .NET 4.0의 경우 VS2010에서, 처리되지 않은 예외의 경우 Silverlight 4 코드에서 작동합니다.
Mike Post

6
중요 참고 사항 : 이것은 async-await 유형 메서드에서는 작동하지 않습니다. 더 여기에
i3arnon

8
MSDN에 따라 DebuggerStepThrough특성은 CLR에 의미가 없습니다. 디버거에 의해 해석됩니다. 안정적으로 다양한 환경에서 작동하지 않는 것, 그것은 DebuggerHidden안정적으로 작동합니다 stackoverflow.com/a/3455100/141172
에릭 J.

64

DebuggerHidden 당신의 친구입니다!

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

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

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

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


VS2008 작업. 캐치 블록을 포함한 전체 방법에 적용해야합니다. 그렇지 않으면 다른 곳에서 휴식을 취하게됩니다
Mark Heath

1
이 속성을 메서드에 추가했고 디버거는 대신 메서드를 호출 할 때 중지되었습니다. 내가 뭔가를 놓치고 있습니까?
Doogal 2010

1
그렇게되어야합니다. 이를 방지하기 위해, 당신은 예외를 처리 ... 또는 다른 방법으로 발신자의 방법으로 표시해야합니다 DebuggerHidden... 물론이
흔들 Weitzhandler에게

1
DebuggerStepThrough 속성은 예외로 인한 중단을 방지하기에 충분해야합니다. DebuggerHidden은 DebuggerNonUserCode 및 DebuggerStepThrough 속성의 조합처럼 작동합니다.
jpierson


14

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

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

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

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


1
이 기능은 VS 2015에서 더 이상 기본적으로 작동하지 않습니다. 활성화 방법은 VS 블로그를 참조하십시오
bhh

슬프게도 VS 2015 해결 방법은 VS 2019를위한하지 작업을 수행
조나단 알렌

13

다른 답변에 지정된 특성 (및 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 블로그 에서 찾을 수 있습니다 .

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


3

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

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

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

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

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

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


3
Visual Studio 2010의 메서드에 DebuggerStepThrough 특성을 추가하면 메서드에서 처리되지 않은 예외가 발생하여 디버거가 중지되지 않습니다.
Tim Murphy

나는 테스트했지만 예방하지 않았습니다. 그것은 여전히 ​​멈춘다
Shimmy Weitzhandler

1
@Shimmy-나를 위해 작동합니다! 예외가 호출 스택 내에서 표시되기를 원하는 지점까지 throw되는 지점에서 각 메서드에 DebuggerStepThrough를 적용하고 있는지 확인합니다. 예외를 포착하고 모든 메서드가 DebuggerStepThrough로 장식 된 호출 계층 내에서 처리하면 해당 예외에서 VS 중단을 볼 수 없습니다.
jpierson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.