본문 바로가기

C++

[C++] 예외 처리

예외 처리는 위와 같이 진행된다. 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