C++ Chapter 14.2 : 예외처리와 스택 되감기
카테고리: Cpp
태그: Cpp Programming
인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 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”를 출력한다.
- main 함수의
- 💛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에서 던진
-1
은 int 타입이다.- int 를 받는 catch를 찾아야 함
- 🟦"End Last"는 출력 부분은 실행되지 않는다.
- throw에서 던진
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”를 출력한다.
- main 함수로 함수를 호출한 지점으로 돌아온다.
- 프로그램 종료.
따라서 throw로 예외 처리를 위한 신호를 던지게 되면 알맞는 catch를 찾을 때 까지, 즉 알맞는 예외 처리를 끝낼 때 까지 그 아래 모든 부분들은 스킵한 채로 강제 되감기 한다. 알맞는 catch를 찾고 나면 찾은 지점 이후부턴 catch 이외의 아래 부분들을 다 정상 실행시킨다.
알맞는
catch
는throw
예외가 일어난 바로 아래 부분에서 찾지 않고 바로 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';
이래버리면 에러가 난다. - 예외를 발생시키지 않는 함수래놓고 예외를 발생시켜서 !
- 이래놓고 함수 안에서
- 이 함수는 예외를 발생시키지 않는다는 의미.
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글남기기