2013-04-28 3 views
0

범위 초과 예외를 throw하는 std::vector에 대한 참조 또는 적어도 예외가 발생한 행 번호 (Java의 스택 추적과 유사)에 액세스하고자합니다. 다음은 예제 프로그램입니다.어떤 벡터가 범위를 벗어난 인덱스 예외를 던졌습니까?

#include <iostream> 
#include <vector> 
std::vector<int> vec1; 
std::vector<int> vec2; 
vec1.push_back(1); 
vec2.push_back(2); 
try 
{ 

    std::cout << vec1.at(1) << std::endl; 
    std::cout << vec2.at(1) << std::endl; 
} 
catch(Exception e) 
{ 
    // e.lineNumber()? e.creator_object()? 
    std::cout << "The following vector is out of range: " << ? << std::endl; 
    // or... 
    std::cout << "There was an error on the following line: " << ? << std::endl; 
} 

이 예제는 간단하지만 필자가 원하는 기능을 보여주기를 바랍니다.

편집 : 구현에서 g ++ --version : g ++ (GCC) 4.1.2 20071124 (레드햇 4.1.2-42)

+0

없음 그런 일은 C++에 내장되어 있습니다. 어쩌면 당신의 구현은 무언가를 가지고 있지만, 우리는 그것을 모르기 때문에 ... – PlasmaHH

+3

액세스 당 두 번 try-catch 문을 사용하십시오. –

+1

줄 번호는 아무 것도주지 않을 것입니다 - 벡터의 STL 헤더에 있습니다 ... 처음에는 두 개의 'try/catch' 블록을 사용할 수 있습니다. – lapk

답변

1

당신이해야 할 것 자신 :

#include <iostream> 
#include <vector> 

std::vector<int> vec1; 
std::vector<int> vec2; 

vec1.push_back(1); 
vec2.push_back(2); 

try 
{ 
    std::cout << vec1.at(1) << std::endl; 
} 
catch(std::exception& e) 
{ 
    std::cout << "The following vector is out of range: " << "vec1" << std::endl; 
} 

try 
{ 
    std::cout << vec2.at(1) << std::endl; 
} 
catch(std::exception& ex) 
{ 
    std::cout << "The following vector is out of range: " << "vec2" << std::endl; 
} 
+0

이 특정 합성 예에서는 중요하지 않습니다. 그리고 아마 "더 안전하다"는 단어를 여기에서 사용하는 것이 가장 좋은 단어는 아니지만, 내가 의미하는 바는 : 'catch (...)'를하면 예외적 인 세부 사항이 없을뿐만 아니라'what()', 네가 무엇을 잡았는지 알지? 어떻게 처리 할거 니? 또한,'/ EHsc'를 사용하여 MSVC++로 컴파일한다면, catch (...)는 Access Violation이나 Stack Overflow와 같은 구조화 된 예외를 잡을 것입니다. 아마도 catch 및/또는 처리 할 것으로 예상되는 것은 아닙니다. – Paul

관련 문제