2017-12-23 12 views
6

주어진 사용자 입력이 유효하지 않은 경우 예외가 발생하는 코드를 작성하여 try/catch 블록에 넣었지만 아직 예외가 발생했습니다 . 코드 자체는 꽤 길기 때문에 여기에 예외가 발생하는 단순화 된 버전의 코드가 있습니다. 예외 자체는 분명합니다. 위치 "3"은 존재하지 않으므로 자연적으로 예외가 발생하지만 try/catch 블록 내부에 있으므로 잡히지 만 그렇지 않습니다.코드가 try/catch 블록 내에 있더라도 예외가 계속 발생합니다.

int main() { 
    try 
    { 
     vector<string> test = vector<string>{ "a","b","c" }; 
     string value = test[3]; 
    } 
    catch (...) 
    { 

    } 
} 

이 코드를 실행하면 try/catch 블록에 있는지 여부에 관계없이 다음 예외가 발생합니다.

Exception

나는 또한 예외 ( const out_of_range&e)을 지정하려하지만 도움이되지 않았다. 방금 동일한 예외가 발생했습니다.

int main() { 
    try 
    { 
     vector<string> test = vector<string>{ "a","b","c" }; 
     string value = test[3]; 
    } 
    catch (const out_of_range&e) 
    { 

    } 
} 

Visual Studio를 사용하고 있는데, IDE 또는 사용하는 컴파일러에서 문제가 될 수 있습니까?

+0

Element 3 회원이 아니십니까? 대신 2를 사용하십시오. – Raindrop7

+2

컴퓨터 시스템에는 여러 가지 유형의 예외가 있습니다. 소프트웨어, 운영 체제 또는 하드웨어 오류로 인해 발생하는 문제가 아닌 C++에서 발생하는 문제 만 잡을 수 있습니다. 당신이 [당신의 프로그램을 디버깅하는 방법을 배우는] 것과 같은 추락 (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). –

+1

* 크래시 *의 원인은 [초급 서적] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)으로 돌아가 검토해야합니다 . –

답변

11

std::vectorstd::out_of_range 예외로 처리하려면 .at() 메서드를 사용해야합니다. operator[]은 예외를 throw하지 않습니다.

예를 들어, 당신은 이런 식으로 뭔가를 할 수 있습니다

std::vector<int> myvector(10); 
try { 
    myvector.at(20)=100;  // vector::at throws an out-of-range 
} 
catch (const std::out_of_range& e) { 
    std::cerr << "Out of Range error: " << e.what() << '\n'; 
} 
8

이는 예외가 아닙니다. 그것은 디버그 어설 션 오류입니다.

예외를 원하면 배열 첨자 연산자가 아닌 벡터의 at (index) 함수를 사용해야합니다.

1

연산자 [] 벡터 컨테이너에 과부하가 있지만, (행동이 위에서 게시물처럼 실패하는 경우 정의되지 않는다 예외 안전하지 않다)

대신 .at() 함수를 사용해야합니다. 예외는 안전합니다. cplusplus.com 참조는 말한다 :

Strong guarantee: if an exception is thrown, there are no changes in the container. 
It throws out_of_range if n is out of bounds. 

읽기 : 예외 안전을 위해 바닥에 http://www.cplusplus.com/reference/vector/vector/operator[]/ http://www.cplusplus.com/reference/vector/vector/at/

봐.