문제

이 페이지를 읽고 있습니다 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() 호출되고 프로그램이 갑자기 종료됩니다. 시간을내어 가십시오 이것.

던지기 사양은 두 가지 목적으로 설계되었습니다.

  1. 인터페이스 구현과 인터페이스 사용자 간의 계약으로 사용하려면, 귀하는 방법에서 예외를 던질 수있는 예외를 설명하기 위해 일부 사람들은 인터페이스의 일부를 고려합니다. (계약) ALA는 Java에서 예외를 확인했습니다.

  2. 컴파일러가 메소드/프로 시저에서 예외를 던질 수없는 경우 특정 최적화를 적용 할 수 있음을 신호를 보낼 수있는 방법으로 예외를 설정하는 비용을 설정하는 데 드는 비용은 비용을 지불합니다.

strash () 절에 지정되지 않은 예외를 던지는 것은 실수입니다. 어떤 시점에서도이를 확인하는 데 필요한 구현은 없습니다. 당신을 위한. 실제로 서브 루틴 호출 서브 루틴의 가능한 모든 예외가 포함되어 있으므로 확인할 수 없습니다. (아마도 다른 모듈에서) 단일 모듈 내에서는 불가능합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top