2010-05-16 5 views
14

C++ 표준 라이브러리 예외에 대한 참조가 있습니까? 난 그냥 어떤 기능이 예외를 던질 수 있는지 여부를 알고 싶습니다. 던져하지 (컴파일러) 보장C++ 표준 라이브러리 예외 목록?

+0

관련 : http://stackoverflow.com/questions/11938979/what-exception-classes-are-in-the-standard-c-library –

답변

19

실제로 대부분의 표준 라이브러리 함수는 예외 자체를 발생시키지 않습니다. 그들은 단지 그들에 의해 호출 된 사용자 코드에 의해 던져진 예외에 전달합니다. 예를 들어 벡터에 요소가 push_back() 인 경우이 개체의 복사 생성자가 throw하는 경우 메모리 할당 오류 및)로 인해 발생할 수 있습니다. 라이브러리 함수가 던져

몇 가지 주목할만한 예외

(웃기려는 의도는) 없습니다 :
  • std::vector<>::at()
  • std::basic_string<>::at()
  • : 제공된 인덱스가 무효 인 경우

    • 어떤 방법이 out_of_range가 발생합니다 std::bitset<>::set(), reset()flip().
  • 일부 방법은 정수 오버 플로우에 std::overflow_error가 발생합니다 :
    • std::bitset<>::to_ulong()와 (C + +0) to_ullong()을.
  • 은 에 의해에 의해 던져진 std::bad_alloc을 전달합니다.
  • 상태 비트가 설정 될 때 std::ios_base::failure이 던져 지도록 스트림을 설정할 수 있습니다.
  • 큰 어레이의 할당이 std::bad_array_new_length
  • 기준에
  • dynamic_cast는이 std::bad_exception
  • 를 슬로우 예외 사양 함수에서 잘못된 예외를 던지고 std::bad_cast (표준 라이브러리의 기술적 속하지)
  • 던질 수 던져 값이없는 경우 std::function::operator(...)을 호출하면 std::bad_function_call이 전달됩니다.
  • null 포인터의 typeinfo을 사용하면 std::bad_typeid이 표시 될 수 있습니다.
  • pointee가 해제 된 후 weak_ptr에 액세스하면 std::bad_weak_ptr이 표시됩니다.
  • std::promise/std::future의 잘못된 사용은 std::future_error이 표시 될 수 있습니다.
  • (C++ 11) 문자열 변환 함수 std::stoi, std::stolstd::stollstd::stoulstd::stoull, std::stof, std::stodstd::stoldstd::invalid_argumentstd::out_of_range 모두를 던질 수있다.
  • (C++ 11) regex 제품군에서 생성자와 할당 메소드는 std::regex_error을 가져올 수 있습니다.

(사람이 더 등 생각할 수있는, 그래서 만약 내가 이것을 CW 응답을 만들고 있어요, 여기를 추가 주시기 바랍니다.)

또한, 는 C++ 프로그래밍 언어의 제 3 판에 대한으로 Bjarne Stroustrup은 다운로드 할 수있는 appendix about exception safety을 다운로드 할 수 있습니다.

+0

+1 링크입니다. 나는 그것을 읽기 시작했다. –

+0

답변 해 주셔서 감사합니다. CW 답변은 무엇입니까? – Brian

+0

@ 브라이언 : "커뮤니티 위키"입니다. 다른 사람들은 CW 응답을 편집 할 수 있습니다 (정상적으로 응답을 편집 할 담당자가없는 경우에도). – sbi

1

유일한 기능이처럼 throw() 예외 사양이 기능은 다음과 같습니다 그들은 특별히하지 않는 한

void ThisFunctionNeverThrows() throw() 
{ 
} 

그렇지 않으면, 다른 기능은 잠재적으로 예외를 던질 수 그렇지 않으면 문서화. 예외 상황에서 코드를 작성할 때는 예외 안전을 고려해야합니다.

예외 안전 및 표준 라이브러리에 대한 Bjarne Stroustup의 기사 : http://www2.research.att.com/~bs/3rd_safe.pdf을 참조하십시오. PDF의 19 페이지부터 표준 컨테이너가 보증하는 정보를 찾을 수 있습니다.

+0

이것은 많은 컨테이너와 같이 정확하지 않습니다. 'erase()'를 던지지 않도록 보장하지만,이 함수는'throw()'가 아닙니다. 언어 관점에서 쓴 것은 의미가 있지만, 컴파일러에 의해 특별히 강제되는 것 이외의 다른 것들이 있습니다. – doublep

+0

@doublep :'erase()'*는 요소 타입의 복사 생성자가 던져 버리면 던질 것입니다. – kennytm

+0

필자가 언급 한 PDF의 21 페이지 (Vector와 Deque에 대한 보증) : "복사 생성자 또는 요소 유형의 대입 연산자가 throw하지 않으면 erase()가 예외를 throw하지 않습니다." –

관련 문제