2009-03-04 3 views
11

C++ 함수에서 발생할 수있는 예외 throw를 선언하면 어떤 이점이 있습니까? 즉, throw() 키워드를 실제로 추가하는 것이 실제로 무엇입니까?C++ 함수에서 허용하는 throw 제한에 어떤 이점이 있습니까?

나는 void do_something() throw();과 같은 함수 선언은 do_something() 함수에서 예외가 발생하지 않는다는 것을 보장해야한다고 읽었습니다. 그러나 이것은 do_something() 내에 호출 된 함수에 대해 사실 인 것처럼 보이지 않으므로 약한 보장을합니다.

이 언어 기능의 유용성 및 최적의 사용 사례를 요약하십시오.

답변

0

는 기본적으로 throw();과 기능을 선언하여 함수는 컴파일러가 어떤 최적화를 수행 할 수 있도록 예외를 던질 것 하지 것을 당신이 특정 퍼센트 백 것을 컴파일러에게. 어쨌든 함수가 예외를 throw하면 정의되지 않은 동작이 발생할 가능성이 높으므로 문제가 발생합니다.

+2

글쎄 -를 제외하고 예외 사양

  • 쓰기되지 않습니다 더 설명하지 실제로 : 그것은 unexpected()를 호출합니다. 잘못 구현 된 동작, 예,하지만 잘 정의 된. – MSalters

  • 5

    C++ 표준에서는 함수가 예외 목록에없는 예외를 throw하려고 시도 할 경우 unexpected() 함수가 호출되어야합니다. MSDN에서 이에 대한 간단한 설명은 다음과 같습니다. http://msdn.microsoft.com/en-us/library/awbt5tew(VS.80).aspx

    대부분의 컴파일러는 실제로이 C++ 기능을 지원하지 않습니다.

    +1

    >> 대부분의 컴파일러는 실제로이 C++ 기능을 지원하지 않습니다 << - 예를 들어, 가리킨 MSVC 설명서 페이지를 참조하십시오 ... –

    1
    void do_something() throw(); 
    

    이것은 구현자가 예외가 발생하지 않는다는 것을 보증합니다. 그것은 무엇을 클라이언트 기대할 수 있습니다. 그러나 함수 내의 어딘가에서 생성 된 예외가 처리되어 부모 do_something()으로 다시 전달되지 않음을 의미합니다. 부끄러움을 누가 다시 throw -eth에서 내면, 왜냐하면 던지기를 멈추게 할 것이 없기 때문입니다. 이는 비어있는 예외 명세가있는 함수 내에서 던져 버리면 사양에 언급되지 않은 예외가 발생하고 프로그램 종료가 예상되는 std::unexpected()이 발생하는 것과 같습니다.

    BTW : 일반적으로 허용되는 강력한 예외 보장 정의는 다음과 같습니다. 어떤 이유로 공개 작업이 실패하면 예외가 발생하고 개체의 상태는 변경되지 않습니다 (원자 작업).

    관련 문제