[C++] 예외(Exception)
카테고리: Cpp
태그: Exception
이 글은 C++ 예외(Exception)를 공부하고 정리한 글입니다
예외
- C++은 예외를 지원
- 하지만, C++에서는 예외의 중요성이 좀 떨어짐
- 코드에서 예외를 처리하는 코드와 그렇지 않은 코드의 어셈블리의 양이 굉장히 많이 차이난다
- 그래서 예외를 처리 안하는게 성능에 좋다
예외 코드
// Exceptions.h #include <exception> struct SlotNullException : public std::exception { const char* what() const throw () { return "Slot is NULL"; } }; // Inventory.cpp Inventory::Inventory(int slotCount) { mSlot = new int[slotCount]; if (mSlots == NULL) { throw SlotNullException(); // 예외 던지기 } } // Main.cpp Inventory* myInventory = nullptr; try { myInventory = new Inventory(5); } catch (const SlotNullException& e) { std::cerr << e.what() << std::endl; } catch (const std::exception& e) { // ... }
적절한 예외 처리 전략
- 유효성 검사/예외는 오직 경계에서만
- 밖에서 오는 데이터를 제어할 수 없기 때문
- 예) 외부에서 들어오는 웹 요청, 파일 읽기/쓰기, 외부 라이브러리
// C# 방식 string ReadFileOrNull(string filename) { if (!File.Exists(filename)) { return null; } try { return File.LoadAllText(filename); } catch (Exception e) { return null; } }
- 일단 시스템에 들어온 데이터는 다 올바르다고 간주할 것
- assert를 사용하여 개발 중 문제를 잡아내고 고칠것
int ConvertToHumanAge(const Animal* pet) { Assert(pet != NULL); // ... }
- 예외 상황이 발생할 때는 NULL을 능동적으로 사용할 것
- 하지만 기본적으로 함수가 NULL을 반환하거나 받는 일은 없어야 함
- 코딩 표준 : 만약 NULL을 반환하거나 받는다면 함수의 이름을 잘 지을 것
const char* GetCoolName(const char* startWithOrNull) const; const char* GetHobbyOrNull() const;
예외는 만병통치약이 아니다
- 동일한 프로그래머가 로직과 예외를 모두 작성
- 로직이 잘못돼 있으면 예외도 틀렸을 가능성이 높음
- 동일한 프로그래머가 작성한 유닛 테스트가 한계를 갖는 이유
- 양질의 소프트웨어는 예외가 아니라 철저한 테스트 계획에서 만들어진다
개발 중 버그 잡기
- 개발 중 코드에서 버그를 잡기 위해서는 assert를 사용
- 전제 조건, 사후 조건, 그리고 불변값 확인
- 또한 assert가 실패하면 올바른 호출 스택을 볼 수 있음
- 품질 관리(QA)가 제대로 이루어지지 않았다면 차라리 소프트웨어가 뻗어 버리게 만드는 게 좋다
- 문제가 바로 드러나기에 바로 고칠 수 있기 때문
- 하지만, 안전과 생명에 관려되는 소프트웨어라면 예외
참조
💻 열심히 공부해서 작성 중이니 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 알려주시면 감사하겠습니다! 😸
댓글 남기기