나는 예외를 참조보다는 상수에 대한 참조로 포착하는 것이 더 낫다는 것을 여러 번 듣고 읽었습니다. 이유 :
try {
// stuff
} catch (const std::exception& e) {
// stuff
}
보다 낫다 :
try {
// stuff
} catch (std::exception& e) {
// stuff
}
답변:
다음이 필요합니다.
후자는 전자 만큼 중요하지는 않지만 const를 삭제하는 유일한 이유는 예외를 변경하고 싶다는 신호를 보내는 것입니다 (일반적으로 컨텍스트를 추가하여 더 높은 수준으로 다시 던지고 싶은 경우에만 유용함). .
std::exception
의 what()
함수) 를 호출 할 수 있음을 의미합니다 . 값으로 포착하면 해당 함수를 호출하고 원래 예외 세부 정보를 가져올 수 없습니다.
기본적으로 전혀 이유가 없습니다.
예외 객체는 자체 메모리 공간에 상주 하므로 † 임시 표현식에서 생성 된 예외를 포착하는 것에 대해 걱정할 필요가 없습니다.
당신이하고있는 모든 당신이 예외 객체를 수정하지 않습니다 것을 약속하지만, 예외 객체는 불변의 인터페이스를 가지고 있어야하기 때문에 ‡ , 여기에 실제 아무것도 정말 없다.
하지만 읽을 때 따뜻하고 아늑하게 느껴질 수도 있습니다. 그게 저를위한 것입니다!
† 고유 한 특수 스레드 로컬 스택이 있습니다.
‡ 면책 조항 : Boost.Exception은 펑키 한 작업을 수행하고 예외 세부 정보를 추가하기 위해이를 중단합니다. 그러나 이것은 해커 리입니다!
Exception objects live in their own memory space
시겠습니까? 그것에 대해 제안 할만한 좋은 책이 있습니까?
같은 이유로 const를 사용합니다.