다소 이상한 문제가 발생했습니다.
이것은 내 코드입니다.
private async Task BreakExpectedLogic()
{
bool test = false;
if (test == true)
{
Console.WriteLine("Hello!");
throw new Exception("BAD HASH!");
}
}
정말 간단 해 보이므로 Console.WriteLine
또는에 맞지 않아야 합니다 throw
. 어떤 이유로 든 항상 throw
.
내가 throw
자신의 방법으로 옮기면 정상적으로 작동합니다. 내 질문은 어떻게 if
블록을 무시 하고 throw new Exception
:
편집 1 : 서명을 포함하도록 코드를 업데이트했지만이 문제와 관련이없는 모든 것을 제거하고 실행했지만 여전히 발생합니다.
답변
async
메서드 의 버그 인 것 같습니다 . 코드 는 실제로 실행되지 않지만 디버거는 throw
문 이있는 줄로 이동 합니다. 이 줄 throw
안에 문장 앞에 몇 줄의 코드가있는 경우 if
디버거 는 with with 줄 로만 이동합니다 throw
.
– 또한, 변수를 사용하지 않는 경우 if (false)
또는 if (true == false)
다음 코드의 올바른 라인 단계 디버거 – 닫는 중괄호합니다.
이 버그는 @Matthew Watson 이 Visual Studio 팀 에 게시했습니다 (현재 링크를 사용할 수 없음).
또한 비슷한 질문을 참조하십시오- 비동기 방법의 조건 확인
편집 (2017/10/06) :
.Net Framework 4.7을 사용하여 VS 2017 15.3.5에서 문제를 재현 할 수 없습니다. VS 팀 이이 문제를 해결 한 것 같습니다.
답변
대답에 대한 부록, 최근에 같은 문제가 발생하여 디버거에서 실제 x86 코드를 보았으며 다음과 같이 이상한 방식으로 생성되었습니다 (단순화).
// if (...) {
0001: jne 0006
...
0006: jmp 0007
// }
0007: ret
따라서 메소드의 마지막 명령어로 직접 점프하는 대신 이중 점프를 수행합니다. 여기서 두 번째 무조건 점프는 if
블록 내부의 코드의 일부로 잘못 인식됩니다 .
따라서이 버그는 JIT 컴파일러와 관련이 있다고 생각합니다.