[C++] 예외 처리

2021. 7. 26. 17:13·C++/Basic
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()알람이 뜬다.

 

 

도움 사이트 : http://tcpschool.com/cpp/cpp_exception_intro

저작자표시 (새창열림)

'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
'C++/Basic' 카테고리의 다른 글
  • [C++] stl set
  • [C++] RTTI
  • [C++] 내포 클래스
  • [C++] 프렌드 클래스
chanheess
chanheess
'왜' 그렇게 했는가?에 대한 생각으로 공부 및 작업의 저장관리
  • chanheess
    왜 그렇게 생각했는가?
    chanheess
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Backend Programming
      • Game Programming
        • Unreal
        • DirectX
      • C++
        • Memo
        • Basic
        • Effective Modern
      • Algorithm
        • Memo
        • Baekjoon
        • Programmers
        • HackerRank, LeetCode
      • Data Structure
      • Design Pattern
      • Etc
        • Memo
        • Daily Log
        • Book
  • 최근 글

  • 최근 댓글

  • 태그

    spring
    프로그래머스
    c++ 기초 플러스
    dfs
    dp
    오블완
    JPA
    Java
    위클리 챌린지
    알고리즘
    JWT
    SpringSecurity
    티스토리챌린지
    백준
  • hELLO· Designed By정상우.v4.10.0
chanheess
[C++] 예외 처리
상단으로

티스토리툴바