상수에 대한 참조로 예외를 포착하는 이유는 무엇입니까?
나는 참조가 아닌 상수 참조로 예외를 포착하는 것이 더 낫다는 것을 여러 번 듣고 읽었습니다. 왜
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
'developer tip' 카테고리의 다른 글
setTimeout에서 약속을 만드는 방법 (0) | 2020.10.22 |
---|---|
람다를 비교하는 방법이 있습니까? (0) | 2020.10.22 |
ThreadPool.QueueUserWorkItem 대 Task.Factory.StartNew (0) | 2020.10.22 |
JavaScript는 64 비트 정수를 지원합니까? (0) | 2020.10.22 |
Linux 커널에서 부동 소수점 사용 (0) | 2020.10.22 |