본문 바로가기

C++

[C++] 예외 처리(try, throw, catch)

예외 처리란?

예외 처리는 어떤 일을 시도하다가 문제가 생기면 예외 처리를 하는 것이다. 프로그램이 작동되다 보면 예외는 존재하기 만련이다.

 

예외 처리는 문제 발생 시 문제를 집어던지고 받는 쪽에서 해결하는 식으로 흘러간다.

 

#include <iostream>
using namespace std;

int main()
{
	int a = 100, b;
	cout << "100을 나눌 정수를 입력하세요 : ";
	cin >> b;
	
	try {
		//0으로 나눌 수 없으므로 0을 던짐
		if (b == 0) throw b;

		//예외가 발생하지 않는다면 실행할 구문
		cout << a / b << endl;
	}

	//던진 0을 받아서 실행할 코드
	catch (int ex) {
		cout << "Error : " << ex << "로 나눌 수 없습니다." << endl;
	}

	return 0;
}

 

결과값:

100을 나눌 정수를 입력하세요 : 0	//입력
Error : 0로 나눌 수 없습니다.

 

입력값에 0을 입력하자 try문을 나가서 catch문이 실행되었다.

 

try-catch문에서 catch문은 여러 개로 구현할 수도 있다. 자료형으로 다중화할 수도 있고 catch문 안에 다른 try-catch문이 있을 수도 있다. 또한, 사용자 정의 클래스를 예외 클래스로 만들어 사용할 수도 있다.

 

다음 예제는 예외 클래스 사용 예이다.

 

#include <iostream>
using namespace std;

class myClass
{
public:
	myClass(int code, const char *msg)
	{
		errorCode = code;
		strcpy_s(errorMsg, sizeof(errorMsg), msg);
	}

	int getErrorCode() const { return errorCode; }
	const char* getErrorMsg() const { return errorMsg; }

private:
	int errorCode;
	char errorMsg[128];
};

int main()
{
	try
	{
		int input = 0;
		cout << "양의 정수를 입력하세요 : ";
		cin >> input;

		if (input < 0)
		{
			myClass ex(10, "양의 정수를 입력해야 합니다.");
			throw ex;
		}
	}

	catch (myClass & ex)
	{
		cout << "Error Code [" << ex.getErrorCode() << "] "
		<< ex.getErrorMsg() << endl;
	}
	
	return 0;
}

 

결과값:

양의 정수를 입력하세요 : -1 //입력
Error Code [10] 양의 정수를 입력해야 합니다.

 

예외 처리 클래스를 만들어서 처리하였다. 프로그램 내부에 만들어야 하는 모든 예외 정보를 한 클래스에서 만들면 유지 보수, 디버깅이 용이하다.