현재 리펙토링을 시도하는 코드가 있습니다. 대규모 예외 집합에는 모든 예외에 대한 공통 코드와 특정 예외 유형별로 개별적으로 처리해야하는 특정 코드가 있습니다. 각 catch
블록에서 공통 부분을 없애는 방법을 알아 내려고 노력 중입니다. 한 가지 아이디어는 다음과 같이 수행하는 것입니다.예외의 공통 부분 처리하기
try {
/* Stuff that may fail */
} catch(const std::exception &) {
/* do common part here */
try { throw; }
catch(const exception1 &) {
/* do stuff for exception1 here */
}
catch(const exception2 &) {
/* do stuff for exception2 here */
}
}
그러나 이것은 다소 추악합니다.
이 일반적인 논리를 제외하고 더 좋은 방법이 있습니까, 아니면 실제로이 시도를 피하기위한 이유가 있습니까?
이것은 내가 지금 가지고있는 것과 매우 유사합니다 (코드에서, 질문에 없습니다). 그러나 이것은 각 예외에서이 메서드에 대한 호출을 가지게 될 것이고 나중에 누군가 예외를 추가하고 혼란을 피하는 것을 잊어 버린다는 것을 의미합니다. 이 버그는 오랜 시간 동안 눈에 띄지 않을 수 있습니다. 왜냐하면 그 조건은 매우 예외적이어서 매우 드물게 처리되기 때문입니다. 따라서 나는 나중에 개발자들에게 이것을 안전하게 유지할 수있는 좋은 방법을 찾고있다. – LiKao
"누군가 나중에 예외를 추가하고 호출을 잊어 버린 경우"그러나 해당 비평은 사용하는 모든 체계에 적용됩니다. 나중에 프로그래머가 잘못 변경했을 수 있습니다. 공통 코드가 함수로 추상화되는 경우, 나중에 프로그래머가 모든 'catch'에 대해 함수를 호출해야한다는 것이 매우 분명합니다. – Raedwald
예, 어떤 계획을 잘못 변경하는 것이 가능하다는 데 동의합니다. 그러나 나에게있어서의 질문은 무엇인가 잘못된 것을 얻는 것이 얼마나 쉬운가하는 것입니다. 코드를 다른 상태로 유지하면서 다른 예외 사례를 추가 할 수 있다면 잘못 이해하기가 어렵습니다. 예외를 추가 할 수 있기 전에 특별한 것을 알아 내야 만한다면 사람들이이를 놓칠 수 있습니다. 어떤 경우에는 적극적으로 무언가를 변경함으로써 물건을 깰 수 있습니다. 다른 경우에는 무언가를 잊어서 물건을 엉망으로 만들 수 있습니다. 두 번째 경우는 대개 IMHO입니다. – LiKao