11.1. 프로그램언어 C++의 기본 예외 처리 방법

프로그램언어 C++에서의 try와 catch 블록 사용법

프로그램언어 C++에서의 try와 catch 블록은 예외 처리를 위해 사용됩니다. try 블록 내에서 예외가 발생할 수 있는 코드를 작성하고, 이에 대한 예외 처리를 catch 블록에서 수행합니다.

try 블록은 예외가 발생할 수 있는 코드를 감싸는 부분으로, 이 부분에서 예외가 발생하면 해당 예외를 처리할 catch 블록으로 제어가 이동합니다. catch 블록은 try 블록에서 발생한 예외를 처리하고 적절한 조치를 취할 수 있도록 도와줍니다.

아래는 C++에서의 try와 catch 블록 사용법에 대한 예제 코드입니다:


#include <iostream>

int main() {
    int a = 10, b = 0;
    
    try {
        if (b == 0) {
            throw "Division by zero error";
        }
        int result = a / b;
        std::cout << "Result: " << result << std::endl;
    } catch (const char* error) {
        std::cout << "Exception caught: " << error << std::endl;
    }
    
    return 0;
}

위 예제 코드에서는 try 블록 내에서 b가 0인 경우 “Division by zero error” 예외를 던지고, catch 블록에서 해당 예외를 처리하고 메시지를 출력하는 예제를 보여줍니다.

프로그램언어 C++에서의 throw 표현식 사용법

프로그램언어 C++에서의 throw 표현식은 예외를 발생시키는 데 사용됩니다. 이를 통해 예외를 처리하거나 상위 호출자에게 전파할 수 있습니다.

throw 표현식은 다음과 같이 사용됩니다:


throw 예외;

여기서 ‘예외’는 어떤 종류의 데이터든 될 수 있습니다. 주로 문자열, 숫자, 객체 등이 사용됩니다. 예외가 발생하면 해당 예외를 처리하는 catch 블록으로 이동하게 됩니다.

예를 들어, 다음은 간단한 예외를 발생시키고 처리하는 코드입니다:


#include <iostream>

void divide(int x, int y) {
    if (y == 0) {
        throw "Divide by zero exception";
    }
    std::cout << "결과: " << x / y << std::endl;
}

int main() {
    try {
        divide(10, 0);
    } catch (const char* msg) {
        std::cerr << "예외 발생: " << msg << std::endl;
    }
    return 0;
}

위 코드에서 divide 함수는 두 수를 나누는데, 만약 두 번째 인자가 0이면 “Divide by zero exception” 예외를 던집니다. main 함수에서는 divide 함수를 호출하고, 발생한 예외를 catch 블록에서 처리합니다.

프로그램언어 C++에서의 예외 계층 구조 이해

C++에서의 예외 처리는 예외 계층 구조를 따릅니다. 이 구조는 예외를 처리하는 방법을 정의하고, 예외를 발생시키고 처리하는 방법을 제공합니다.

예외 계층 구조는 다음과 같습니다:

  • 기본 클래스: std::exception
    • 이 클래스는 모든 표준 예외 클래스의 부모 클래스입니다. 예외 처리 시 이 클래스를 사용하여 예외를 처리할 수 있습니다.
  • 표준 예외 클래스: std::runtime_error, std::logic_error 등
    • 이러한 클래스는 특정 유형의 예외를 나타내며, 각각의 예외 유형에 따라 적절한 처리 방법을 제공합니다.

아래는 간단한 예제 코드입니다. 이 코드는 배열 인덱스를 벗어난 접근 시 발생하는 예외를 처리하는 예제입니다.


#include <iostream>
#include <stdexcept>

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    int index = 6;

    try {
        if (index >= 5) {
            throw std::out_of_range("Index out of range");
        }
        std::cout << "Value at index " << index << ": " << arr[index] << std::endl;
    } catch (std::out_of_range& e) {
        std::cerr << "Exception caught: " << e.what() << std::endl;
    }

    return 0;
}

프로그램언어 C++에서의 표준 예외 클래스 사용법

프로그램언어 C++에서의 표준 예외 클래스는 특정 예외 상황을 나타내는 미리 정의된 클래스들을 말합니다. 이러한 예외 클래스들은 std::exception 클래스를 상속받아 구현되어 있어서 예외 처리를 보다 쉽게 할 수 있도록 도와줍니다.

예외 클래스를 사용하기 위해서는 먼저 헤더 파일 <exception>을 포함해야 합니다. 그리고 예외를 던질 때는 throw 키워드를 사용하고, 예외를 잡을 때는 try-catch 블록을 활용합니다.

가장 기본적인 표준 예외 클래스는 std::runtime_error이며, 이 클래스는 런타임 오류를 나타냅니다. 다른 표준 예외 클래스로는 std::logic_error, std::invalid_argument, std::out_of_range 등이 있습니다.

아래는 간단한 예제 코드입니다. 이 예제에서는 std::invalid_argument 예외를 던지고, try-catch 블록을 사용하여 예외를 처리하는 방법을 보여줍니다.


#include <iostream>
#include <exception>

void divide(int a, int b) {
    if (b == 0) {
        throw std::invalid_argument("Divisor cannot be zero");
    }
    std::cout << "Result: " << a / b << std::endl;
}

int main() {
    try {
        divide(10, 0);
    } catch (std::invalid_argument& e) {
        std::cerr << "Exception caught: " << e.what() << std::endl;
    }
    return 0;
}

프로그램언어 C++에서의 예외 사양(specification) 이해 및 선언 방법

프로그램언어 C++에서의 예외 사양(specification)은 예외 처리에 관련된 규칙과 방법을 정의한 것입니다. C++에서는 예외 처리를 통해 프로그램 실행 중 발생할 수 있는 오류나 예외 상황을 처리할 수 있습니다. 예외 사양은 함수가 어떤 종류의 예외를 던질 수 있는지 명시하고, 호출자가 어떻게 그 예외를 처리해야 하는지 알려줍니다.

예외 사양은 함수의 선언 시에 키워드 ‘throw’를 사용하여 명시할 수 있습니다. 다음은 예외 사양을 선언하는 방법입니다.


void myFunction() throw(int, double);

위의 예제에서 ‘myFunction’은 int 또는 double 타입의 예외를 던질 수 있음을 나타냅니다. 만약 함수가 다른 타입의 예외를 던질 경우, 컴파일러는 경고를 표시할 수 있습니다.

또한, C++11부터는 noexcept 키워드를 사용하여 함수가 예외를 던지지 않음을 명시할 수도 있습니다. 다음은 noexcept를 사용한 예제입니다.


void myFunction() noexcept;

위의 예제에서 ‘myFunction’은 어떤 예외도 던지지 않음을 나타냅니다. 이를 통해 컴파일러는 해당 함수가 예외를 던지지 않음을 보장하고 최적화할 수 있습니다.

예외 사양을 명시함으로써 함수가 던질 수 있는 예외를 명확히하고, 호출자가 적절히 처리할 수 있도록 도와줍니다. 이를 통해 안정성을 높이고 예외 처리를 보다 효율적으로 할 수 있습니다.

Leave a Comment