C++ Chapter 14.2 : 예외처리와 스택 되감기

Date:     Updated:

카테고리:

태그:

인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!


chapter 14. 예외처리 : 예외처리와 스택 되감기

🔔 예외처리 과정

#include <iostream>
using namespace std;

void last()
{
	cout << "Last" << endl;  // 💛 5 💛
	cout << "Throws exception" << endl;  // 💛 6 💛

	throw -1;
	cout << "End Last" << endl; // 🟦 실행 X 🟦
}

void third()
{
	cout << "Third" << endl; // 💛 4 💛

	last();

	cout << "End third" << endl;  // 🟦 실행 X 🟦
}

void second()
{
	cout << "Second" << endl; // 💛 3 💛

	try
	{
		third();
	}
	catch (double)
	{
		std::cerr << "Second caught double exception!" << endl;  // 🟦 실행 X 🟦
	}
	cout << "End second" << endl;  // 🟦 실행 X 🟦
}

void first()
{
	cout << "First" << endl;  // 💛 2 💛

	try
	{
		second();
	}
	catch (int)
	{
		std::cerr << "first caught int exception!" << endl; // 💛 7 💛
	}
	cout << "End first" << endl; // 💛 8 💛
}

int main()
{
	cout << "Start" << endl;  // 💛 1 💛

	try
	{
		first(); 
	}
	catch (int)
	{
		std::cerr << "main caught int exception!" << endl;  // 🟦 실행 X 🟦
	}
	cout << "End of main" << endl; // 💛 9 💛
}
💎출력💎

Start
First
Second
Third
last
Throws exception
first caught int exception!
End first
End of main

출력 및 실행 순서 💛주석 참고💛

  • 💛1💛
    • main 함수에서 “Start”를 출력한다.
  • 💛2💛
    • main 함수의 try에서 first() 함수를 호출한다.
    • first() 함수에서 “First”를 출력한다.
  • 💛3💛
    • first() 함수의 try에서 second() 함수를 호출한다.
    • second() 함수에서 “Second”를 출력한다.
  • 💛4💛
    • second() 함수의 try에서 third() 함수를 호출한다.
    • third() 함수에서 “Third”를 출력한다.
  • 💛5💛
    • third() 함수의 try에서 last() 함수를 호출한다.
    • last() 함수에서 “Last”를 출력한다.
  • 💛6💛
    • last() 함수에서 “Throws exception”를 출력한다.
  • last() 함수에서 throw에서 catch를 향해 에러 메세지 `-1` 을 던졌다.
    • throw에서 던진 -1int 타입이다.
      • int 를 받는 catch를 찾아야 함
    • 🟦"End Last"는 출력 부분은 실행되지 않는다.
  • third() 함수에서 last() 함수를 호출한 지점으로 돌아온다.
    • 그러나 -1을 받을 수 있는 catch가 없으므로 그 지점 아래의 아무것도 실행하지 않고 지나간다.
      • 🟦 "End third"는 출력 부분은 실행되지 않는다.
  • second() 함수에서 third() 함수를 호출한 지점으로 돌아온다.
    • 그러나 second() 함수에 있는 catch (double)는 double 타입만 받으므로 int인 -1을 받을 수 없으므로 그냥 지나간다.
      • 🟦 "Second caught double exception!" 출력 부분은 실행되지 않는다.
    • 🟦 "End third"는 출력 부분은 실행되지 않는다.
  • 💛7💛
    • first() 함수에서 second() 함수를 호출한 지점으로 돌아온다.
      • catch (int)에서 -1을 받을 수 있으므로
        • first() 함수의 catch(int)에서 “first caught int exception!”를 출력한다.
  • 💛8💛
    • first() 함수에서 “End first”를 출력한다.
  • 💛9💛
    • main 함수로 함수를 호출한 지점으로 돌아온다.
      • 🟦 그러나 first() 함수의 catch(int)에서 이미 예외를 처리했으므로 main 함수의 catch(int)는 실행되지 않는다.
        • 만약 first() 함수의 catch가 catch(double) 이었다면 main 함수의 catch(int)가 실행되고 여기서 -1을 받았을 것이다.
    • main 함수에서 “End of main”를 출력한다.
  • 프로그램 종료.

따라서 throw로 예외 처리를 위한 신호를 던지게 되면 알맞는 catch를 찾을 때 까지, 즉 알맞는 예외 처리를 끝낼 때 까지 그 아래 모든 부분들은 스킵한 채로 강제 되감기 한다. 알맞는 catch를 찾고 나면 찾은 지점 이후부턴 catch 이외의 아래 부분들을 다 정상 실행시킨다.

알맞는 catchthrow 예외가 일어난 바로 아래 부분에서 찾지 않고 바로 Skip 후 스택 되감기를 통해 알맞는 catch를 찾는다.

  • 스택을 통해 계속해서 되감아서 알맞는 catch로 잡히면 끝난다.
  • 이미 스택 상 위쪽에서 알맞는 catch를 찾아 예외처리를 했다면 아래 쪽의 예외처리는 실행 되지 않는다.


🔔 catch(…)

catch(...) : 모든 데이터 타입을 다 받을 수 있는 catch 이다.

catch(int)
{
    cerr << "main caught int exception" << endl;
}
catch(...)
{
    cerr << "main caught ellipses exception" << endl;
}
  • throw가 던진 에러 메세지가 int가 아니라면 catch(...)에서 예외처리가 될 것이다.


🔔 함수와 throw

void last() throw(int)
{
	cout << "Last" << endl;  
	cout << "Throws exception" << endl; 

	throw 'a';

	cout << "End Last" << endl; 
}
  • void last() throw(int)
    • 이 함수는 int 타입의 에러 메세지를 던질 수도 있다는 의미.
  • void last() throw(...)
    • 이 함수는 어떤 타입의 에러 메세지든 던질 수도 있다는 의미.
  • void last() throw()
    • 이 함수는 예외를 발생시키지 않는다는 의미.
      • 이래놓고 함수 안에서 throw 'a'; 이래버리면 에러가 난다.
      • 예외를 발생시키지 않는 함수래놓고 예외를 발생시켜서 !


🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

Cpp 카테고리 내 다른 글 보러가기

댓글 남기기