C++ 예외 처리

안녕하세요, 더 나은 프로그래머를 꿈꾸는 여러분! 오늘, 우리는 C++ 예외 처리의 흥미로운 세계로 여행을 떠날 것입니다. 여러분의 친절한 이웃 컴퓨터 과학 교사로서, 저는 이 중요한 주제를 안내해 드리겠습니다. 그럼, 좋아하는 음료수를 준비하고 편하게 앉아서, 함께 빠져들어봅시다!

C++ Exception Handling

예외란 무엇인가요?

여러분이 예외를 계란으로 던지는 경험丰富的 장인처럼 예외를 던질 전에, 예외가 무엇인지 이해해 봅시다. 프로그래밍 세계에서 예외는 프로그램이 실행 중에 발생하는 예상치 못한 사건입니다. 그들은 제가 과거에 준비한 예비 시험과도 같습니다 (이거 미안합니다!) - 예상치 못하고 때로는 처리하기 어려운 일입니다.

예외는 프로그램의 지시어의 정상적인 흐름을 방해합니다. 다양한 요인들로 인해 발생할 수 있습니다, 예를 들어:

  1. 0으로 나누기
  2. 배열의 범위를 벗어난 접근
  3. 메모리가 부족함
  4. 존재하지 않는 파일을 열려고 시도

이제, C++가 이러한 예상치 못한 상황을 어떻게 우아하게 관리할 수 있을지 살펴보겠습니다.

예외 던지기

기본적인 던지기

C++에서는 throw 키워드를 사용하여 예외를 발생시킵니다. 이는 수업에서 질문이나 문제가 있을 때 손을 들는 것과 같습니다. 다음은 간단한 예입니다:

#include <iostream>
using namespace std;

int main() {
try {
throw 20;
}
catch (int e) {
cout << "예외가 발생했습니다. 예외 번호: " << e << endl;
}
return 0;
}

이 예제에서는 정수 예외를 값 20으로 던집니다. 걱정 마세요, 곧 잡을 것입니다!

다양한 형식의 던지기

C++는 여러 가지 형식의 예외를 던질 수 있도록 유연하게 해줍니다. 더 praktische 예제를 살펴보겠습니다:

#include <iostream>
#include <stdexcept>
using namespace std;

double divide(int a, int b) {
if (b == 0) {
throw runtime_error("0으로 나누기!");
}
return static_cast<double>(a) / b;
}

int main() {
try {
cout << divide(10, 2) << endl;  // 이는 잘 작동할 것입니다
cout << divide(10, 0) << endl;  // 이는 예외를 던질 것입니다
}
catch (const runtime_error& e) {
cout << "캐치한 예외: " << e.what() << endl;
}
return 0;
}

이 예제에서는 0으로 나누는 경우 runtime_error 예외를 던입니다. 이는 우리의 수학적 지역에 "0으로 나누기 금지" 또는를 걸어 두는 것과 같습니다!

예외 잡기

기본적인 잡기

이제 예외를 던는 방법을 알았으므로, 예외를 잡는 방법을 배워보겠습니다. 예외를 잡는 것은 코드가 던진 모든 것을 처리할 준비가 되어 있는 책임감 있는 애완동물 주인과도 같습니다!

우리는 try-catch 블록을 사용하여 예외를 잡습니다. try 블록에는 예외를 던질 수 있는 코드가 포함되고, catch 블록은 예외가 발생했을 때 처리합니다.

#include <iostream>
using namespace std;

int main() {
try {
int age = -5;
if (age < 0) {
throw "나이는 음수일 수 없습니다!";
}
cout << "나이는: " << age << endl;
}
catch (const char* msg) {
cerr << "오류: " << msg << endl;
}
return 0;
}

이 예제에서는 나이가 음수인지 확인하고 있습니다. 만약 음수라면, 커스텀 오류 메시지와 함께 예외를 던집니다.

여러 예외 잡기

때로는 같은 코드에서 다양한 형식의 예외가 발생할 수 있습니다. 이 경우, 여러 catch 블록을 가질 수 있습니다:

#include <iostream>
#include <stdexcept>
using namespace std;

int main() {
try {
int choice;
cout << "정수 예외를 위해 1, 런타임 오류를 위해 2를 입력하십시오: ";
cin >> choice;

if (choice == 1) {
throw 42;
} else if (choice == 2) {
throw runtime_error("적색 런타임 오류가 나타났습니다!");
} else {
throw "알 수 없는 선택!";
}
}
catch (int e) {
cout << "캐치한 정수 예외: " << e << endl;
}
catch (const runtime_error& e) {
cout << "캐치한 런타임 오류: " << e.what() << endl;
}
catch (...) {
cout << "알 수 없는 예외를 캐치했습니다!" << endl;
}
return 0;
}

이 예제는 다양한 형식의 예외를 잡는 방법을 보여줍니다. catch (...) 블록은 앞의 catch 블록들이 잡지 못한 모든 예외를 처리합니다. 이는 모든 예상치 못한 놀라움을 처리하는 안전망과도 같습니다!

C++ 표준 예외

C++는 프로그램에서 사용할 수 있는 표준 예외 집합을 제공합니다. 이들은 예외 세계에서의 스위스 Army 톱니칼과도 같습니다 - 다양하고 항상 준비되어 있습니다!

다음은 일부 일반적으로 사용되는 표준 예외입니다:

예외 설명
std::runtime_error 런타임 논리 오류
std::logic_error 논리 오류
std::out_of_range 범위를 벗어난 접근
std::overflow_error 산술 오버플로
std::bad_alloc 메모리 할당 실패

표준 예외를 사용하는 예제를 살펴보겠습니다:

#include <iostream>
#include <vector>
#include <stdexcept>
using namespace std;

int main() {
vector<int> numbers = {1, 2, 3, 4, 5};
try {
cout << numbers.at(10) << endl;  // 이는 out_of_range 예외를 던질 것입니다
}
catch (const out_of_range& e) {
cerr << "Out of Range error: " << e.what() << endl;
}
return 0;
}

이 예제에서는 벡터의 범위를 벗어난 요소에 접근하려고 시도하고 있습니다. at() 함수는 이 경우 out_of_range 예외를 발생시킵니다.

새 예외 정의

표준 예외는 크지만, 때로는 특정 요구사항에 더 맞춤형 예외가 필요할 수 있습니다. 이를 위해 커스텀 예외를 정의할 수 있습니다!

다음은 여러분 자신의 예외 클래스를 정의하는 방법입니다:

#include <iostream>
#include <exception>
using namespace std;

class NegativeValueException : public exception {
public:
const char* what() const throw() {
return "음수는 허용되지 않습니다!";
}
};

double squareRoot(double x) {
if (x < 0) {
throw NegativeValueException();
}
return sqrt(x);
}

int main() {
try {
cout << squareRoot(25) << endl;  // 이는 잘 작동할 것입니다
cout << squareRoot(-5) << endl;  // 이는 우리의 커스텀 예외를 던질 것입니다
}
catch (const NegativeValueException& e) {
cerr << "오류: " << e.what() << endl;
}
return 0;
}

이 예제에서는 NegativeValueException 클래스를 정의하고 있습니다. 우리는 squareRoot 함수에서 음수를 입력받으면 이 예외를 던저서 처리합니다.

그리고 이렇게 끝났습니다, 여러분! 우리는 C++ 예외 처리의 기본을 다루었습니다. 예외는 여러분의 코드를 더 견고하고 오류에 내성을 갖추는 데 도움을 줍니다. 연습을 계속하면서, 곧 전문가처럼 예외를 처리할 수 있을 것입니다!

코딩을 즐겁게, 여러분의 예외는 항상 잡혀지길 바랍니다!

Credits: Image by storyset