8. Error Handling and Exceptions

에러 처리와 예외에 대해 알아보자.

68. Assert liberally to document internal assumptions and invariants.

적극적이도록 하라. assert나 그와 같은 것을 관대하게 써서 모듈 내의 가정들을 문서화하라 (ex. 호출자와 피호출자가 같은 사람이나 팀에 의해 유지보수되는 경우) – 이 가정들이 항상 사실이어야 하고 아니면 프로그래밍 오류를 표현할 때 (ex. 함수의 호출자에 의해 감지된 함수의 사후조건 위반) assert가 부가 효과를 일으키지 않도록 하라.

69. Establish a rational error handling policy, and follow it strictly.

의식적으로 특정하고, 공들여 적용하라. 너무 많은 프로젝트들이 그때그때 판단을 잘못 내린다. 실용적이고, 일관적이고, 합리적인 에러 처리 정책을 설계 초기에 개발하고 그에 맞춰라. 그것이 다음을 포함하도록 하라:

  • 식별: 어떤 조건이 에러인가
  • 심각도: 각 에러가 얼마나 중요하거나 급한가
  • 감지: 어떤 코드가 에러를 감지하는 데 책임이 있는가
  • 전파: 에러를 각 모듈에 보고하고 전파하는 데 있어 어떤 메커니즘이 사용되는가
  • 처리: 어떤 코드가 에러에 대해 무언가를 하는 책임이 있는가
  • 보고: 에러는 어떻게 기록되거나 사용자가 알림받는가

에러 처리 메커니즘 변경은 모듈 경계에서만 하라.

70. Distinguish between errors and non-errors.

계약 조건의 깨짐은 에러이다. 함수는 작업의 단위이다. 그러므로, 실패들은 에러로 보이거나 아니면 함수의 기능의 효과에 기반한 무언가로 보여야 한다. 함수 f 내에서, 실패는 f의 사전조건을 깨거나 f의 호출자의 사전조건을 가로막거나 f 자신의 사후조건을 얻는 것을 막거나 f가 책임이 있는 불변조건을 공유할 때 이를 재설립하면 그것이 실패이다.

구체적으로, 여기서는 내부 프로그래밍 에러는 제외한다 (ex. 호출자와 피호출자가 같은 사람이나 팀의 책임을 갖고, 예를 들면 모듈 내에서일 때) 이는 별개의 카테고리로 대개는 assert를 사용해 다뤄져야 한다.

71. Design and write error-safe code.

약속하더라도 징벌하지는 말라. 각 함수에서 가장 강한 안전성 보장을 하되 그것이 필요 없는 호출자는 징벌하지 말라. 최소한 가장 기본적 보장을 하라.

에러가 항상 프로그램을 올바른 상태로 내버려 두도록 하라. 이것은 기본적 보장이다. 불변조건을 깨는 에러 (누수를 포함하지만 이에 한정되지는 않는다) 는 그냥 버그이다.

마지막 상태가 원본 상태거나 (에러가 있으면 동작이 원복되던가), 목표한 대상 상태이거나 (동작이 수행될 때 에러가 없던가)를 추가적으로 보장하는 것을 선호하라. 이것이 강한 보장이다.

동작이 절대 실패하지 않음을 추가적으로 보장하는 것을 선호하라. 이것은 대부분의 함수들에 대해 가능하지 않지만, 이는 소멸자나 할당 해제와 같은 함수들에는 필요하다. 이는 실패 없는 보장이다.

72. Prefer to use exceptions to report errors.

피해를 입으면 예외를 받으라. 에러를 보고할 때 예외를 에러 코드에 비해 선호하라. 예외가 사용될 수 없거나 에러가 아닌 조건에 대해서는 상태 코드 (ex. 반환 코드, errno)를 사용하라. 복구가 불가능하거나 필요하지 않으면 정식 종료나 비정식 종료를 하라.

73. Throw by value, catch by reference.

적절하게 잡는 것을 배워라. 값으로 예외를 던져라 (포인터가 아니다) 그리고 참조로 잡아라 (보통 const 참조로). 이는 예외 의미와 가장 잘 맞는 조합이다. 같은 예외를 다시 던질 때는 throw e; 대신 throw;를 선호하라.

74. Report, handle, and translate errors appropriately.

언제를 언제 말할 지를 알라. 에러가 감지되고 에러로서 식별된 시점에 보고하라. 에러를 그것이 교정될 수 있는 가장 가까운 레벨로 다루거나 전달하라.

75. Avoid exception specifications.

예외 명세는 C++20에서 삭제되었다. 쓰지 마라.

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중