[Python 예외 처리]에서 설명한 것 처럼, 때로는 예외 상황을 강제로 에러 처리를 하는 경우도 발생한다. 개발자가 예상하지 못했던 오류나 코드의 비일관성으로 인해 유지하는데 어려움을 겪는 경우가 발생하기 때문이다. C++에서는 이런 예외 처리를 try와 catch로 묶어서 사용한다.

 

#include <iostream>
#include <vector>

using namespace std;

int main(){
	vector<int> number;
	int index = 0;
	try{
		index = number.at(5);
	}
	catch (exception error){
		cout << error.what() << endl;
	}
	return 0;
}

코드를 간단히 설명하자면, 정수를 저장하는 벡터(number)와, 정수형 변수 index를 선언한 후, 벡터의 5번째 인자에 접근을 시도한 것이다.  try-catch 구문이 없다면 벡터 내부에는 아무런 데이터가 없기 때문에 접근 범위를 벗어났다는 의미의 out_of_range 오류가 발생한다. 위와 같이 예외 처리를 하면 문제가 발생하더라도 계속 실행을 하며, 오류 내용에 대해 출력해서 어떤 문제가 있는지 확인할 수 있다. 

try-catch를 넣지 않고 실행한 경우(좌) / try-catch를 포함한 위 코드를 실행한 경우(우)

 


상황에 따라서 catch 영역을 여러 군데로 나누어 처리할 수도 있다.

#include <iostream>

using namespace std;

// try-catch에 throw 사용

void division(int num1, int num2) {
	if (num2 == 0)
		throw logic_error("Division Zero ERROR!!!");
	else if (num2 > 9)
		throw out_of_range("OUT OF RANGE");
	else
		cout << num1 << " / " << num2 << "is " << num1 / num2 << endl;
}

int main() {
	try {
		division(9, 3);
		division(3, 0);
		division(9, 11);
	}
	catch (out_of_range & e) {
		cout << "1 : " << e.what() << endl;
	}
	catch (logic_error & e) {
		cout << "2 : " << e.what() << endl;
	}
	return 0;
}

 

코드는 나누기 연산을 수행하는 division 함수를 통해 3가지 경우에 대해 try문이 실행되도록 작성한 것이다. 오류가 발생했을 때 수행할 catch 문은 나누는 수가 0인 경우, 9보다 큰 경우의 2가지로 나누었다. 실행된 결과를 보면 division(9, 3)은 문제가 없으므로 정상적으로 출력되었다. 그리고, division(3, 0)은 나누는 수가 0이기 때문에 logic_error라는 예외 처리를 통해 "Division Zero ERROR!!!"가 출력되게 했다. 그런데, 하나의 try문에 대해서는 하나의 catch문만 수행하기 때문에 division(9, 11)은 처리되지 않고 종료되었다. 마찬가지로, division(3, 0)과 division(9, 11)의 순서를 바꾸게 되면 out_of_range라는 예외 처리를 통해 "OUT OF RANGE"만 출력되는 것을 확인할 수 있다.

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기