[C++] 예외(Exception)

Date:     Updated:

카테고리:

태그:

이 글은 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)
    {
        // ...
    }
    

    적절한 예외 처리 전략

    1. 유효성 검사/예외는 오직 경계에서만
      • 밖에서 오는 데이터를 제어할 수 없기 때문
      • 예) 외부에서 들어오는 웹 요청, 파일 읽기/쓰기, 외부 라이브러리
      // C# 방식
      string ReadFileOrNull(string filename)
      {
          if (!File.Exists(filename))
          {
              return null;
          }
      
          try
          {
              return File.LoadAllText(filename);
          }
          catch (Exception e)
          {
              return null;
          }
      }
    
    1. 일단 시스템에 들어온 데이터는 다 올바르다고 간주할 것
      • assert를 사용하여 개발 중 문제를 잡아내고 고칠것
      int ConvertToHumanAge(const Animal* pet)
      {
          Assert(pet != NULL);
          // ...
      }
    
    1. 예외 상황이 발생할 때는 NULL을 능동적으로 사용할 것
      • 하지만 기본적으로 함수가 NULL을 반환하거나 받는 일은 없어야 함
      • 코딩 표준 : 만약 NULL을 반환하거나 받는다면 함수의 이름을 잘 지을 것
      const char* GetCoolName(const char* startWithOrNull) const;
      
      const char* GetHobbyOrNull() const;
    

예외는 만병통치약이 아니다

  • 동일한 프로그래머가 로직과 예외를 모두 작성
    • 로직이 잘못돼 있으면 예외도 틀렸을 가능성이 높음
    • 동일한 프로그래머가 작성한 유닛 테스트가 한계를 갖는 이유
  • 양질의 소프트웨어는 예외가 아니라 철저한 테스트 계획에서 만들어진다

개발 중 버그 잡기

  • 개발 중 코드에서 버그를 잡기 위해서는 assert를 사용
    • 전제 조건, 사후 조건, 그리고 불변값 확인
    • 또한 assert가 실패하면 올바른 호출 스택을 볼 수 있음
  • 품질 관리(QA)가 제대로 이루어지지 않았다면 차라리 소프트웨어가 뻗어 버리게 만드는 게 좋다
    • 문제가 바로 드러나기에 바로 고칠 수 있기 때문
    • 하지만, 안전과 생명에 관려되는 소프트웨어라면 예외


참조

포큐아카데미 C++ 언매니지드 프로그래밍



💻 열심히 공부해서 작성 중이니 오류나 틀린 부분이 있을 경우 
  언제든지 댓글 혹은 메일로 알려주시면 감사하겠습니다! 😸

맨 위로 이동하기

Cpp 카테고리 내 다른 글 보러가기

댓글 남기기