[c++] 컨테이너 예외 처리

C++에서 컨테이너는 데이터를 저장하고 관리하는데 사용되는 중요한 도구입니다. 그러나 컨테이너는 인덱스 범위를 초과하거나 메모리 부족으로 인한 예외 상황을 처리해야 할 수도 있습니다. 이러한 예외 상황에 대해 효과적으로 대응하려면 몇 가지 기본적인 접근 방법을 숙지하고 있어야 합니다.

정적 예외 처리

컨테이너에서 발생하는 예외 상황은 주로 인덱스 오버플로우메모리 부족 등이 있습니다. 이러한 예외 상황은 각 컨테이너 유형에 따라 다르게 처리됩니다. 예를 들어, 배열은 인덱스 범위를 벗어난 경우 std::out_of_range 예외가 발생합니다.

try {
    std::vector<int> vec = {1, 2, 3};
    int value = vec.at(10);
    // 이 코드는 실행되지 않음
} catch (std::out_of_range& e) {
    std::cout << "인덱스가 범위를 벗어났습니다: " << e.what() << std::endl;
}

동적 예외 처리

동적 예외 처리는 try-catch 블록을 사용하여 프로그램의 특정 섹션에서 예외를 처리하는 방법을 의미합니다. 이를 통해 예외가 발생하면 그에 따른 적절한 조치를 취할 수 있습니다.

try {
    std::vector<int> vec = {1, 2, 3};
    int value = vec.at(10);
    // 이 코드는 실행되지 않음
} catch (std::out_of_range& e) {
    std::cout << "인덱스가 범위를 벗어났습니다: " << e.what() << std::endl;
} catch (std::exception& e) {
    std::cout << "다른 예외가 발생했습니다: " << e.what() << std::endl;
}

사용자 정의 예외 클래스

컨테이너 예외 처리를 개선하기 위해 사용자 정의 예외 클래스를 만들어 사용할 수도 있습니다. 이를 통해 특정 예외 상황에 대해 더 상세한 정보를 제공하거나 사용자 정의 조치를 취할 수 있습니다.

class CustomException : public std::exception {
public:
    CustomException(const std::string& message) : m_message(message) {}
    const char* what() const noexcept override {
        return m_message.c_str();
    }
private:
    std::string m_message;
};

try {
    std::vector<int> vec = {1, 2, 3};
    int value = vec.at(10);
    // 이 코드는 실행되지 않음
} catch (std::out_of_range& e) {
    std::cout << "인덱스가 범위를 벗어났습니다: " << e.what() << std::endl;
} catch (CustomException& e) {
    std::cout << "사용자 정의 예외가 발생했습니다: " << e.what() << std::endl;
} catch (std::exception& e) {
    std::cout << "다른 예외가 발생했습니다: " << e.what() << std::endl;
}

컨테이너 예외 처리는 안정적인 프로그램을 작성하는 데 필수적인 부분이며, 적절한 예외 처리 메커니즘을 구현함으로써 안정화된 애플리케이션을 개발할 수 있습니다.

참고 자료