
예외 처리는 위와 같이 진행된다. try 블럭 내에서 throw로 예외를 던지면 그 타입에 따른 catch 문으로 이동한다.
class C
{
int a;
public:
C() { puts("생성자 호출"); }
~C() { puts("파괴자 호출"); }
};
void divide(int a, int d)
{
if (d == 0) throw "0으로는 나눌 수 없습니다.";
printf("나누기 결과 = %d입니다.\n",a/d);
}
void calc(int t,const char *m)
{
C c;
divide(10,0);
}
void main()
{
try {
calc(1,"계산");
}
catch(const char *message) {
puts(message);
}
puts("프로그램이 종료됩니다.");
}
처음에 divide에서 예외가 발생하는데 catch문이 없으므로 calc로 돌아가고 자신의 스택 프레임을 정리한다.
calc에서도 catch문이 없으므로 calc를 호출한 main으로 돌아가고 자신의 스택 프레임을 정리한다. 이 과정에서 지역 객체인 c가 파괴되면서 파괴자가 호출된다. main에서는 던진 것에 맞는 catch문이 있으므로 예외처리한다.
이렇게 throw가 catch로 한번에 점프하면 스택의 호출 정보가 엉망이 되어버린다. 그래서 호출원으로 돌아갈 때 자신을 호출한 함수의 모든 스택을 정리하는 것이다. 이것을 스택 되감기라고 한다.
try {
try {
...
}
catch(int) {
throw;
}
}
catch(int n) {
printf("%d는 음수이므로 적합하지 않습니다.\n",n);
}
예외 처리가 중첩되어 있을 경우 내부의 catch문이 throw를 통해 외부 catch문으로 점프한다.
'C++' 카테고리의 다른 글
| [C++] RTTI (0) | 2022.01.07 |
|---|---|
| [C++] 예외 객체 (0) | 2022.01.07 |
| [C++] 클래스 템플릿 (0) | 2022.01.06 |
| [C++] 함수 템플릿 (0) | 2022.01.06 |
| [C++] 순수 가상 함수 (0) | 2022.01.06 |