#include <iostream>
using namespace std;
void divide(int num1, int num2) {
if (num2 == 0) {
throw num2; // 예외 발생
}
cout << "몫 : " << num1 / num2 << endl;
cout << "나머지 : " << num1 % num2 << endl;
}
int main() {
int num1, num2;
cout << "두개의 수를 입력 : ";
cin >> num1 >> num2;
try { // 예외 상황이 발생할수 있는 부분
divide(num1, num2);
cout << "나눗셈 완료" << endl;
}
catch (int err) { // int 자료형을 받아서 처리한다.
cout << "나누는 수는 " << err << "이 될 수 없습니다." << endl;
cout << "프로그램을 다시 시작하세요." << endl;
}
cout << "프로그램을 종료합니다." << endl;
return 0;
}
예외처리가 되지 않아서 함수를 호출한 영역으로 예외 데이터가 전달되는 현상을 "스택 풀기"라고 한다.
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
int StoI(char* str) {
int len = strlen(str);
int num = 0;
if (len != 0 && str[0] == '0') {
throw 0; // int 자료형 throw
}
for (int i = 0; i < len; i++) {
if (str[i] <'0' || str[i]> '9') {
throw str[i]; // char 자료형 throw
}
num += (int)(pow((double)10, (len - 1) - i) * (str[i] - '0'));
}
return num;
}
int main() {
char str1[100];
char str2[100];
while (1) {
cout << "두개의 숫자 입력 : ";
cin >> str1 >> str2;
try {
int num1 = StoI(str1);
int num2 = StoI(str2);
cout << str1 << " + " << str2 << " = " << num1 + num2 << endl;
break;
}
catch (int errNum) {
cout << errNum << "으로 시작하는 숫자는 입력 불가" << endl;
}
catch (char errCh) {
cout << "문자 " << errCh << "가 입력되었습니다." << endl;
}
cout << "재입력을 진행합니다." << endl << endl;
}
cout << "프로그램을 종료합니다." << endl;
return 0;
}
catch의 매개변수를 엘립스(...) 으로 표현하면 모든 종류의 예외를 포착할 수 있다.
try {
// 예외가 발생할 가능성 있는 문장
}
catch(exptype1 e) {
// exptype1 자료형 예외 처리
}
catch(exptype2 e) {
// exptype2 자료형 예외 처리
}
catch(...) {
// 위에서 처리가 안된 모든 유형의 예외 처리
}