미누에요
[C++] 예외처리 try, catch, throw 본문
728x90
반응형
SMALL
C++에서도 예외 처리에 try, catch, throw를 사용한다.
try
- 예외가 발생할 거 같은 지역을 try 속에 넣는다.
- 예외가 발생한다면, 그 지점 아래의 코드는 실행되지 않는다.
try{
// 예외 발생 예상지역
}
catch
- try 블록에서 발생한 예외(throw로 던져진 예외)를 여기서 catch한다.
- 발생한 에외를 처리하는 부분이다. (에러 출력과 같은 작업)
- 예외가 발생하지 않는다면 실행되지 않는다.
catch{
// 예외 처리 코드
}
throw
- 예외가 발생했을 때 throw를 보통 던지도록 설계한다.
- throw를 던지면 catch가 있는 부분까지 빠져나간다.
- 예외가 발생하면 throw 아래의 코드는 실행되지 않는다.
throw 값;
예제 코드를 통해 살펴보자.
#include<iostream>
using namespace std;
int main(void){
int num1, num2;
cout << "두 개의 숫자 입력 : ";
cin >> num1 >> num2;
try{
if(num2==0)
throw num2;
cout << "나눗셈의 몫 : " << num1 / num2 << endl;
cout << "나눗셈의 나머지 : " << num1 % num2 << endl;
}
catch(int expn){
cout << "계수는 " << expn << "이 될 수 없습니다." << endl;
cout << "프로그램을 다시 실행하세요." << endl;
}
cout << "end of main" << endl;
return 0;
}
위 코드는 두 숫자의 나눗셈을 하는 과정에서, 나누는 수가 0일 경우에 에러가 발생한다.
num2==0인 경우에 num2를 throw하여 바깥의 catch에서 받는다.
catch에서는 num2의 값이 expn에 저장되어 출력된다.
실행 결과
+) 만약 throw한 값을 여러 개의 catch에 맞게 받고싶다면, catch 의 매개변수 타입을 다르게하여 알맞는 catch에 가도록 할 수 있다.
#include<iostream>
using namespace std;
int main(void){
int num1, num2;
cout << "두 개의 숫자 입력 : ";
cin >> num1 >> num2;
try{
if(num2==0)
throw num2;
cout << "나눗셈의 몫 : " << num1 / num2 << endl;
cout << "나눗셈의 나머지 : " << num1 % num2 << endl;
}catch(double expn){ // throw한 값의 타입이 double이라면 여기서 catch
cout << "catch(double expn)" << endl;
cout << "계수는 " << expn << "이 될 수 없습니다." << endl;
cout << "프로그램을 다시 실행하세요." << endl;
}
catch(int expn){ // throw한 값의 타입이 int라면 여기서 catch
cout << "catch(int expn)" << endl;
cout << "계수는 " << expn << "이 될 수 없습니다." << endl;
cout << "프로그램을 다시 실행하세요." << endl;
}
cout << "end of main" << endl;
return 0;
}
실행 결과
throw된 값이 int이므로 catch(int expn)에서 catch한 것을 확인할 수 있다.
throw된 값을 catch하지 않으면 계속해서 바깥으로 catch를 찾아나간다.
#include<iostream>
using namespace std;
void SimpleFuncOne(void);
void SimpleFuncTwo(void);
void SimpleFuncThree(void);
int main(void){
try{
SimpleFuncOne();
}
catch(int expn){
cout << "예외 코드 : " << expn << endl;
}
return 0;
}
void SimpleFuncOne(void){
cout << "SimpleFuncOne(void)" << endl;
SimpleFuncTwo();
}
void SimpleFuncTwo(void){
cout << "SimpleFuncTwo(void)" << endl;
SimpleFuncThree();
}
void SimpleFuncThree(void){
cout << "SimpleFuncThree(void)" << endl;
throw -1;
}
실행 결과
위 코드에서는 SimpleFuncThree에서 에러를 throw하여 catch를 찾아 역순으로 SimpleFuncThree -> SimpleFuncTwo -> SimpleFuncOne -> main으로 이동하여 main의 catch에서 에러를 처리한 것을 보인다.
이렇듯 throw된 값을 처리하지 못하면 계속해서 catch를 찾을때까지 이동하게 된다.
728x90
반응형
LIST
'C++' 카테고리의 다른 글
[C++] C++ 형 변환 연산자 (1) | 2024.07.24 |
---|---|
[C++] 템플릿의 부분 특수화 (0) | 2024.07.24 |
[C++] 템플릿(Template), 템플릿 특수화(Specialization) (1) | 2024.07.24 |
[C++] 윤성우의 열혈 C++ 13-2 클래스 템플릿의 정의 문제풀이 (2) | 2024.07.23 |
[C++] 윤성우의 열혈 C++ 13-1 함수 템플릿의 정의 문제풀이 (0) | 2024.07.23 |