2017-12-10 138 views
0

Visual Studio 2017의 C++에서 assert 메서드를 테스트 중이며 예상 한대로 어설 션 예외가 발생합니다. 그러나 모든 catch (!) 예외 설정을 해제 한 후에는 catch 블록에서 처리하기 전에 예외가 발생합니다 (아래 예제 참조). Visual Studio 예외 설정이 무시되었습니다. C++

try { 
    assert(validate(1363821) == false); 
    assert(validate(3848238) == true); 
    printf("Validation correctly implemented."); 
} catch (exception & e){ 
    const string error = e.what(); 
    printf("Validation failed!"); 
} 

그래서 제 질문은 다음과 같습니다

  • 은 내가 잘못 여기서 뭔가를하고 있습니까?
  • 또는 assert 메서드는 catch 블록에서 처리 할 수없는 일종의 예외를 throw하고 항상 치명적인 예외를 생성합니까? 그렇다면 치명적인 오류를 만들지 않고 어떻게 assert 메서드를 구현할 수 있습니까? 아래 그림과 같습니다

내 예외 설정이 설정되지 않습니다 enter image description here

어떤 도움이 크게 감사합니다!

+0

"나는 여전히 catch 블록에 의해 처리되기 전에 예외가 발생한다."라는 말은 메시지 박스가 생기고, 비주얼 스튜디오가 아니며, assert가 어떻게 구현되는지를 의미한다. – tkausl

+0

@tkausl messagebox의 제목은 "Microsoft Visual C++ 런타임 라이브러리"이며 '디버그 오류!'메시지가 나타납니다. 메시지. 이 비주얼 스튜디오 아닌가요? 그렇지 않다면 어떻게이 메시지 박스를 막을 수 있습니까? 또는 변경할 수없는 디자인 별 동작입니까? – etri

+2

릴리스 모드에서 컴파일하십시오. 그러나 코드가 예상대로 작동하는지 여부를 확인하는 것처럼 보이기 때문에 테스트 프레임 워크를 사용해야합니다. – tkausl

답변

2

어설 션 오류는 예외를 throw하지 않아야합니다. 대신 구현 관련 보고서 작업 (예 : stderr에 오류 메시지를 출력하거나 해당 대화 상자 표시)을 수행 한 다음 std::abort을 호출합니다. 따라서 catch IDE의 블록 및/또는 예외 처리 설정은이 상황에서 아무 것도하지 않습니다. 어설 션에서 예외를 throw하려면 매크로 치환 문자 assert을 작성해야합니다.

일부 정렬 확인 검사를 사용하는 경우 boost :: test와 같은 일부 전용 프레임 워크를 사용하는 것이 좋습니다. 그럼 당신은 간단하게 작성할 수 있습니다

BOOST_AUTO_TEST_CASE(Doc_Parse_Empty) 
{ 
    BOOST_TEST(validate(1363821) == false); 
    BOOST_TEST(validate(3848238) == true); 
} 
또한 자동으로 원활하게보고 성공/실패를 처리

가 VS.에 통합

+0

아, 알겠습니다. 그래서 assert 메서드는 버그가 있다는 것을 지적하고 애플리케이션을 종료하는 데 실제로 옳은 것 같아서 try catch 블록으로 쉽게 건너 뛸 수 없습니다. 그게 다야? – etri

+0

그냥 궁금해 ... "Win32 예외> 0xc0000420 어설 션 실패"예외 설정 때문에 내가 추측하는 잘못된 트랙에 설정되었습니다. 그래서 분명히 이것은 Assert 메서드 에러를 supressing하는 것과 아무런 상관이 없습니까? – etri

+1

@etri 디버그 빌드를 체크 인하는 invariants를 처리하기 위해'assert' 매크로가 존재합니다. 그리고 어설 션 오류는 치명적인 오류로 처리됩니다 (즉, 프로그램 실행이 계속 허용되지 않습니다). 그러나 몇 가지 대안으로 내 대답을 업데이 트했습니다. – VTT