C ++ 예외에 대해. func () trash ()
문제
이 페이지를 읽고 있습니다 http://www.cplusplus.com/doc/tutorial/exceptions.htmlfunction () trash ()를 작성하면; 그 기능에서는 예외를 던질 수 없습니다. 나는 MSVC 2005 Writing Throw (), Throw (int), Throw ()에서 전혀 아무것도 시도하지 않았습니다. 각각은 똑같은 결과를 가졌습니다. 아무것도 아님. 나는 int, char*, 다른 유형을 던졌고 그것은 모두 같은 방식으로 잡혔습니다. 던지기가 전혀 영향을 미치지 않는 것 같습니다. function () tash ()는 실제로 무엇을합니까?
해결책
보다 이 기사 C ++ 예외 사양 및 Microsoft 구현에 대한 자세한 내용 :
Microsoft Visual C ++ 7.1은 비어 있지 않으면 예외 사양을 무시합니다. 빈 예외 사양은 동일합니다
__declspec(nothrow)
, 그리고 컴파일러가 코드 크기를 줄이는 데 도움이 될 수 있습니다....] 빈 예외 사양이 보이면 자신이하고있는 일을 알고 예외를 다루기 위해 메커니즘을 최적화한다고 가정합니다. 당신의 기능이 어쨌든 던지면 - 음, 당신을 부끄러워하십시오. 이 기능을 100% 긍정적 인 경우에만 기능이 던지지 않으며 절대하지 않습니다.
다른 팁
당신이 찾고있는 것은 VC ++의 버전이 사양 예외를 시행하지 않았다는 것입니다. 나는 그것이 표준의 분산으로 기록 된 것으로 생각합니다.
그러나 예외 사양은 일반적으로 좋은 생각이 아닙니다. 프로그램이 표준 정보 구현 (VS 2005의 VC ++ 가이 경우에 없었던)에서 프로그램을 위반하는 경우 시스템은이를 포착해야합니다. 이는 사양이 컴파일러 최적화 힌트가 아니라 컴파일러가 추가 길이로 이동하고 때로는 차선책을 생성하도록 강요한다는 것을 의미합니다.
보다 부스트 이론적 근거 고도로 평가 된 부스트 프로젝트가 예외 사양을 사용하지 않는 이유로. 이것은 부스트입니다. 이것은 언어의 고급 부분으로 이상하고 유용한 일을하는 포스터 아이의 무언가입니다.
(MIS) 이해
두 번째 문제는 당신이 얻는 것을 아는 것과 관련이 있습니다. Boost Exception Specification Rationale의 저자를 포함한 많은 주목할만한 사람들이 그것을 말 했으므로 프로그래머는 프로그래머가 실제로 행동하는 방식 대신에 프로그래머가 원하는 방식으로 행동하는 것처럼 예외 사양을 사용하는 경향이 있습니다.
많은 사람들이 예외 사양이 다음과 같이 생각하는 것입니다.
함수는 나열된 예외 만 던질 수 있음을 보장합니다 (아마도 없음).
예외 (아마도 없음) 만 던져진 지식에 따라 컴파일러 최적화를 활성화합니다.
위의 기대는 다시, 기만적으로 정확합니다.
자세한 내용은 링크를 참조하십시오.
예외를 던지면 충분하지 않습니다. try {} catch()
예외를 포착하는 블록. 예외를 포착하지 않으면 std::terminate()
호출되고 프로그램이 갑자기 종료됩니다. 시간을내어 가십시오 이것.
던지기 사양은 두 가지 목적으로 설계되었습니다.
인터페이스 구현과 인터페이스 사용자 간의 계약으로 사용하려면, 귀하는 방법에서 예외를 던질 수있는 예외를 설명하기 위해 일부 사람들은 인터페이스의 일부를 고려합니다. (계약) ALA는 Java에서 예외를 확인했습니다.
컴파일러가 메소드/프로 시저에서 예외를 던질 수없는 경우 특정 최적화를 적용 할 수 있음을 신호를 보낼 수있는 방법으로 예외를 설정하는 비용을 설정하는 데 드는 비용은 비용을 지불합니다.
strash () 절에 지정되지 않은 예외를 던지는 것은 실수입니다. 어떤 시점에서도이를 확인하는 데 필요한 구현은 없습니다. 당신을 위한. 실제로 서브 루틴 호출 서브 루틴의 가능한 모든 예외가 포함되어 있으므로 확인할 수 없습니다. (아마도 다른 모듈에서) 단일 모듈 내에서는 불가능합니다.