예외 처리 (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) 소개"에 대해 다룰 예정입니다. 질문이나 피드백이 있으면 댓글로 남겨 주세요!
'-----ETC----- > C++ 마스터 시리즈' 카테고리의 다른 글
[C++ 마스터] Day 20: STL 벡터와 리스트 (0) | 2024.08.01 |
---|---|
[C++ 마스터] Day 21: STL 맵과 셋 (0) | 2024.08.01 |
[C++ 마스터] Day 19: 표준 템플릿 라이브러리 (STL) 소개 (0) | 2024.08.01 |
[C++ 마스터] Day 16: 가상 함수와 추상 클래스 (0) | 2024.08.01 |
[C++ 마스터] Day 17: 템플릿 기초 (0) | 2024.08.01 |