본문 바로가기
-----ETC-----/C++ 마스터 시리즈

[C++ 마스터] Day 18: 예외 처리

by cogito21_cpp 2024. 8. 1.
반응형

예외 처리 (Exception Handling)

예외 처리는 프로그램 실행 중에 발생할 수 있는 오류를 처리하는 방법입니다. C++에서는 try, catch, throw 키워드를 사용하여 예외를 처리할 수 있습니다. 이를 통해 프로그램의 비정상적인 종료를 방지하고, 오류를 처리할 수 있습니다.

 

1. 예외 처리 기본 구조

예외 처리는 try 블록, catch 블록, throw 문으로 구성됩니다.

  • try 블록: 예외가 발생할 가능성이 있는 코드를 포함합니다.
  • catch 블록: 예외가 발생했을 때 실행되는 코드를 포함합니다.
  • throw 문: 예외를 발생시킵니다.
#include <iostream>

using namespace std;

int main() {
    try {
        int a = 10;
        int b = 0;
        if (b == 0) {
            throw "Division by zero!";  // 예외 발생
        }
        int c = a / b;
        cout << c << endl;
    } catch (const char* msg) {
        cout << "Caught exception: " << msg << endl;  // 예외 처리
    }
    return 0;
}

 

2. 표준 예외 클래스

C++ 표준 라이브러리에는 여러 예외 클래스가 정의되어 있습니다. 예를 들어, std::exception 클래스는 모든 표준 예외의 기본 클래스입니다.

#include <iostream>
#include <exception>

using namespace std;

int main() {
    try {
        int* arr = new int[1000000000];  // 메모리 할당 실패 시 bad_alloc 예외 발생
    } catch (bad_alloc& e) {
        cout << "Caught exception: " << e.what() << endl;  // 예외 메시지 출력
    }
    return 0;
}

 

3. 사용자 정의 예외 클래스

사용자 정의 예외 클래스를 작성하여, 특정 예외 상황을 처리할 수 있습니다.

#include <iostream>
#include <exception>

using namespace std;

class MyException : public exception {
public:
    const char* what() const noexcept override {
        return "My custom exception";
    }
};

int main() {
    try {
        throw MyException();  // 사용자 정의 예외 발생
    } catch (MyException& e) {
        cout << "Caught exception: " << e.what() << endl;  // 예외 메시지 출력
    }
    return 0;
}

 

예제 문제

문제 1: 두 수를 나누는 프로그램 작성 (예외 처리 포함)

두 개의 정수를 입력받아 나누는 프로그램을 작성하세요. 두 번째 정수가 0일 경우 예외를 발생시키고 처리하세요.

 

해설:

#include <iostream>

using namespace std;

int divide(int a, int b) {
    if (b == 0) {
        throw "Division by zero!";  // 예외 발생
    }
    return a / b;
}

int main() {
    int num1, num2;
    cout << "Enter two numbers: ";
    cin >> num1 >> num2;

    try {
        int result = divide(num1, num2);
        cout << "Result: " << result << endl;
    } catch (const char* msg) {
        cout << "Caught exception: " << msg << endl;  // 예외 처리
    }
    return 0;
}

 

이 프로그램은 두 개의 정수를 입력받아 나누고, 두 번째 정수가 0일 경우 예외를 발생시키고 처리합니다.

 

문제 2: 배열 인덱스 범위 초과 예외 처리

사용자로부터 배열의 크기와 요소를 입력받고, 주어진 인덱스의 요소를 출력하는 프로그램을 작성하세요. 인덱스가 범위를 초과할 경우 예외를 발생시키고 처리하세요.

 

해설:

#include <iostream>
#include <exception>

using namespace std;

class OutOfRangeException : public exception {
public:
    const char* what() const noexcept override {
        return "Index out of range";
    }
};

int main() {
    int size;
    cout << "Enter the size of the array: ";
    cin >> size;

    int* arr = new int[size];
    cout << "Enter " << size << " elements: ";
    for (int i = 0; i < size; i++) {
        cin >> arr[i];
    }

    int index;
    cout << "Enter an index to access: ";
    cin >> index;

    try {
        if (index < 0 || index >= size) {
            throw OutOfRangeException();  // 예외 발생
        }
        cout << "Element at index " << index << ": " << arr[index] << endl;
    } catch (OutOfRangeException& e) {
        cout << "Caught exception: " << e.what() << endl;  // 예외 처리
    }

    delete[] arr;
    return 0;
}

 

이 프로그램은 배열의 인덱스가 범위를 초과할 경우 예외를 발생시키고 처리합니다.

 

문제 3: 표준 예외 클래스를 사용하여 파일 열기 예외 처리

파일을 열고 읽는 프로그램을 작성하세요. 파일이 존재하지 않거나 열 수 없는 경우 예외를 발생시키고 처리하세요.

 

해설:

#include <iostream>
#include <fstream>
#include <stdexcept>

using namespace std;

void readFile(const string& filename) {
    ifstream file(filename);
    if (!file.is_open()) {
        throw runtime_error("Could not open file");  // 예외 발생
    }

    string line;
    while (getline(file, line)) {
        cout << line << endl;
    }

    file.close();
}

int main() {
    string filename;
    cout << "Enter the filename: ";
    cin >> filename;

    try {
        readFile(filename);
    } catch (runtime_error& e) {
        cout << "Caught exception: " << e.what() << endl;  // 예외 처리
    }
    return 0;
}

 

이 프로그램은 파일을 열고 읽는 중 파일이 존재하지 않거나 열 수 없는 경우 예외를 발생시키고 처리합니다.

 

다음 단계

18일차의 목표는 C++의 예외 처리에 대해 학습하는 것이었습니다. 다음 날부터는 표준 템플릿 라이브러리(STL) 소개에 대해 다룰 것입니다.

 

내일은 "표준 템플릿 라이브러리 (STL) 소개"에 대해 다룰 예정입니다. 질문이나 피드백이 있으면 댓글로 남겨 주세요!

반응형