developer tip

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

optionbox 2020. 10. 22. 07:56
반응형

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


나는 참조가 아닌 상수 참조로 예외를 포착하는 것이 더 낫다는 것을 여러 번 듣고 읽었습니다.

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

보다 낫다

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

다음이 필요합니다.

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

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


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

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

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

하지만 읽을 때 따뜻하고 아늑하게 느껴질 수 있습니다. 그게 제게있어!

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


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


예외를 수정 하시겠습니까? 그렇지 않으면 const 일 수도 있습니다. 다른 곳에서 const를 사용해야하는 동일한 이유 (SOULD라고 말한 이유는 표면에서 그다지 큰 차이를 만들지 않고 컴파일러에게 도움이 될 수 있으며 코더가 코드를 올바르게 사용하고하지 말아야 할 일을하지 않도록 도와주기 때문입니다)

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


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

참고 URL : https://stackoverflow.com/questions/2145147/why-catch-an-exception-as-reference-to-const

반응형