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


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::exception의 what()함수) 를 호출 할 수 있음을 의미합니다 . 값으로 포착하면 해당 함수를 호출하고 원래 예외 세부 정보를 가져올 수 없습니다.
— 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.