이번엔 try-catch를 알아보겠다. 일단 예제를 보자.
double Hmean(double a, double b);
int main()
{
double x, y, z;
cout << "두 수 입력하세요: ";
while (cin >> x >> y)
{
try
{
z = Hmean(x, y);
}
catch (const char* s)
{
cout << s << endl;
cout << "두 수를 새로 입력하세요: ";
continue;
}
cout << "(x + y) / (x - y) = " << z << endl;
cout << "다른 두 수를 입력하세요(끝내려면 q): ";
}
cout << "프로그램 종료.\n";
}
double Hmean(double a, double b)
{
if (a == -b)
throw "a = -b는 허용되지 않음.";
return (a + b) / (a - b);
}
실행 결과.
예외가 일어날만한 구문을 try 코드 블럭 안에 쓴다. 그리고 throw에는 예외가 발생하면 던져줄(?) 코드를 작성한다. Hmean 함수가 실행 되고 예외가 발생하면 if 문에 들어가서 throw를 실행한다. 그럼 함수가 종료되고, 함수의 연쇄를 거슬러 올라가 프로그램은, Hmean 함수가 main()의 try에서 실행됐다는 것을 판단한다. 그럼 그에 맞는 catch에 들어간다. 그에 맞는 catch가 뭔가? catch에는 매개 변수가 있는데, 여기의 데이터형은 throw 뒤에 있는 데이터형과 같아야 한다. 이 예시에서는 문자열을 사용했기 때문에 const char* s를 사용하였다. 만약 데이터형이 다르면? throw에 맞는 catch를 찾지 못하고, throw에서 함수를 종료시키는 게 아니라, 다음 문구를 그대로 실행한다. 클래스 객체같은 것도 매개 변수로 사용 가능하다. 만약 예외가 발생하지 않아면 catch 형에 들어가지 않는다.