abort() 호출
void Test::hmean(double a, double b)
{
if (a == -b)
{
std::cout << "dddddd";
std::abort();
std::cout << "dddddd"; //출력되지 않음
}
}
- abort에 도달하게 되면 에러 메시지를 출력하고 프로그램을 중단한다.
예외 메커니즘
double hmean(double a, double b);
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
double x, y, z;
std::cout << "두 수를 입력하십시오 : ";
while (cin >> x >> y)
{
try {
z = hmean(x, y);
}
catch (const char* s)
{
std::cout << s << std::endl;
std::cout << "두 수를 새로 입력하십시오 : ";
continue;
}
std::cout << x << ", " << y << "의 조화 평균은 "
<< z << "입니다.\n";
cout << "다른 두 수를 입력하십시오(끝내려면 q) : ";
}
cout << "프로그램을 종료합니다.\n";
return 0;
}
double hmean(double a, double b)
{
if (a == -b)
throw "잘못된 hmean() 매개변수: a = -b는 허용되지 않습니다."; //char* 데이터형
return 2.0 * a * b / (a + b);
}
- try안에서 throw로 예외가 걸린다면 실행중인 부분에서 바로 catch함수로 넘어가게된다.
- catch의 const char * s는 이 핸들러가 문자열로 발생된 예외를 받아들인다는 것을 의미한다.
- 만약 데이터형이 맞는 핸들러가 없을경우 (catch가 int라면?) 기본적으로 abort()함수를 호출하게 된다.
catch (const char * s)
{
std::cout << s << "\n";
std::cout << "두 수를 새로 입력하십시오 : ";
continue;
}
catch (...)
{
std::cout << "두 수를 새로 입력하십시오 : ";
continue;
}
catch에서 if, else와 같이 나머지들을 ...으로 표현할 수 있다.
class bad1 { };
class bad2 : public bad1 { };
class bad3 : public bad2 { };
void duper(int w) throw(bad1)
{
int x = w;
if (x == 1)
throw bad1();
if (x == 2)
throw bad2();
if (x == 3)
throw bad3();
}
int main()
{
int x;
cin >> x;
try
{
duper(x);
}
catch (bad3& b)
{
cout << "bad3";
}
catch (bad2& b)
{
cout << "bad2";
}
catch (bad1& b)
{
cout << "bad1";
}
}
- 파생 클래스 객체의 파생된 순서의 역순으로 배치를 해야한다.
- bad1 & 핸들러가 첫 번째면 bad1, bad2, bad3 예외들을 포착한다. (상속을 생각해보면 알 수 있다.)
catch에서 예외가 없었다면?
#include <exception>
void myQuit()
{
cout << "포착X";
exit(5);
}
void duper(int w)
{
int x = w;
if (x == 3)
throw 3;
}
int main()
{
int x, y, z;
cin >> x;
set_terminate(myQuit); //catch에서 발견하지 못 했을때의 실행할 함수 삽입
try
{
duper(x);
}
catch (bad1& b)
{
cout << "bad1";
}
}
- 데이터형이 맞는 핸들러가 없을경우 기본적으로 abort()함수를 호출하게 된다.
- #include <exception>을 선언하면 사용할 수 있는 set_terminate();를 사용하면 맞는 데이터형이 없을 때 삽입한 함수를 호출한다. exit()를 사용하지않으면 abort()알람이 뜬다.
'C++ > Basic' 카테고리의 다른 글
[C++] stl set (0) | 2021.08.09 |
---|---|
[C++] RTTI (0) | 2021.08.02 |
[C++] 내포 클래스 (0) | 2021.07.23 |
[C++] 프렌드 클래스 (0) | 2021.07.22 |
[C++] 템플릿 클래스 (0) | 2021.07.19 |