상수에 대한 참조로 예외를 포착하는 이유는 무엇입니까?


84

나는 예외를 참조보다는 상수에 대한 참조로 포착하는 것이 더 낫다는 것을 여러 번 듣고 읽었습니다. 이유 :

try {
    // stuff
} catch (const std::exception& e) {
    // stuff
}

보다 낫다 :

try {
    // stuff
} catch (std::exception& e) {
    // stuff
}

답변:


67

다음이 필요합니다.

  • 다형 적으로 예외에 액세스 할 수있는 참조
  • 성능을 높이고 컴파일러에게 객체를 수정하지 않을 것임을 알리는 const

후자는 전자 만큼 중요하지는 않지만 const를 삭제하는 유일한 이유는 예외를 변경하고 싶다는 신호를 보내는 것입니다 (일반적으로 컨텍스트를 추가하여 더 높은 수준으로 다시 던지고 싶은 경우에만 유용함). .


1
"컴파일러에게 객체를 수정하지 않을 것임을 알려주십시오."-객체를 매개 변수로 함수 호출에 전달하는 경우 유용 할 수 있습니다.
Craig McQueen 2013

1
'다형 적으로 예외에 액세스'란 무엇을 의미합니까?
mango

3
@mango는 아마도 가상 함수 (예 : std::exceptionwhat()함수) 를 호출 할 수 있음을 의미합니다 . 값으로 포착하면 해당 함수를 호출하고 원래 예외 세부 정보를 가져올 수 없습니다.
MM

11
apple clang 7과 gcc 5 (최적화 O3 포함)에 의해 생성 된 어셈블리를 살펴 보았으며 const ref와 non-const ref 어셈블리 사이에 어떤 차이도 보지 못했습니다. 그래서, 난 GCC와 사과 그 소리에 대한 최적화에 차이가없는 것 같아요
Vasiliy Soshnikov

2
컴파일러는 수정하는 개체와 수정하지 않는 개체 ( SSA 및 상수 전파)를 쉽게 확인할 수 있습니다 . 더 나은 설명이 필요합니다 (또는 신화입니까?).
rustyx

31

기본적으로 전혀 이유가 없습니다.

예외 객체는 자체 메모리 공간에 상주 하므로 임시 표현식에서 생성 된 예외를 포착하는 것에 대해 걱정할 필요가 없습니다.

당신이하고있는 모든 당신이 예외 객체를 수정하지 않습니다 것을 약속하지만, 예외 객체는 불변의 인터페이스를 가지고 있어야하기 때문에 , 여기에 실제 아무것도 정말 없다.

하지만 읽을 때 따뜻하고 아늑하게 느껴질 수도 있습니다. 그게 저를위한 것입니다!

고유 한 특수 스레드 로컬 스택이 있습니다.
면책 조항 : Boost.Exception은 펑키 한 작업을 수행하고 예외 세부 정보를 추가하기 위해이를 중단합니다. 그러나 이것은 해커 리입니다!


자세히 설명해 주 Exception objects live in their own memory space시겠습니까? 그것에 대해 제안 할만한 좋은 책이 있습니까?
Richard Dally

@LeFlou : 표준을 알려줄 수는 있지만 "읽기 좋은"것으로 간주하는 것은 약간 오해의 소지가 있습니다. : P
궤도의 Lightness Races in Orbit

확실히 그렇습니다. 표준 관점에서 이에 대해 더 많이 배우는 것은 흥미로울 것입니다. C ++ 성능에 대한 기술 보고서를 읽고 있습니다. 관련 문서가 더 있습니까?
Richard Dally

@LeFlou : 글쎄, 그것은 .... 표준 자체보다 더 권위하지 않습니다
궤도의 밝기 경주를

1
@RichardDally는 C ++ Primer 5th , § 18.1.1 Excpetion Object를 확인합니다. 그것은 말한다 호출 어떤 캐치에 액세스 할 수 있도록 보장 컴파일러에 의해 관리되는 공간에서 예외 개체 상주. 예외 개체는 예외가 완전히 처리 된 후에 삭제됩니다.
Rick

5

코드를 최적화하는 데 도움이 될 수있는 예외를 수정하는 함수를 호출하지 않을 것임을 컴파일러에 알립니다. 아마도 큰 차이는 없지만 비용도 매우 적습니다.


2

예외를 수정 하시겠습니까? 그렇지 않으면 const 일 수도 있습니다. 다른 곳에서는 const를 사용해야하는 것과 같은 이유입니다.

예외 처리기는 플랫폼에 따라 다를 수 있으며 변경 될 것으로 예상하지 않기 때문에 재미있는 장소에 예외를 둘 수 있습니까?


-1

같은 이유로 const를 사용합니다.


그리고 :-) 포인터를 통해 참조를 선호하는 이유와 같은 이유
디미트리 C.

12
간단하고 깔끔하지만 실제로는 대답이 아닙니다.
Omnifarious
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.