Stack Unwinding(스택 풀기)
Programming/C++ 2012. 10. 18. 02:28 |MyFunc라는 함수를 호출했는데, 그 안에서 throw절이 실행되면서 예외가 발생했다. 그런데 이 함수내에는 예외처리를 위한 try~catch 문이 존재하지 않는다.
그렇다면 이 상황에서 발생한 예외는 어떻게 처리될까?
-> 이러한 경우 예외처리에 대한 책임은 MyFunc를 호출한 영역으로 넘어가게 된다.
위 예제의 divide 함수 내에서는, 매개변수 num2의 값이 0인 경우 예외가 발생하는데, 이 위치를 감싸는 try~catch 문은 존재하지 않는다. 이런 경우 Divide 함수를 호출한 21행의 위치로 예외 데이터가 전달된다.
물론 예외 데이터가 전달되었으니, 예외처리에 대한 책임도 함께 넘어간다. 따라서 21행을 감싸는 try~catch문에 의해서 예외가 처리된다.
결론 : 예외가 처리되지 않으면, 예외가 발생한 함수를 호출한 영역으로 예외 데이터가(더불어 예외처리에 대한 책임까지) 전달된다.
예외상황이 발생한 위치와 예외상황을 처리해야 하는 위치가 다른경우의 예제.
예외의 발생과 처리에 대한 가장 일반적인 모델을 보여준다.
이 예제로 알 수 있는 점: 함수 내에서 함수를 호출한 영역으로 예외 데이터를 전달하면, 해당 함수는 더 이상 실행되지 않고 종료가 된다.
즉, 함수 내에서 예외 데이터를 전달하면, return 문의 실행을 통한 함수의 종료와 마찬가지로 함수를 완전히 빠져 나오는 꼴이 된다.
스택 풀기(Stack Unwinding)
- 예외가 처리되지 않아서, 함수를 호출한 영역으로 예외 데이터가 전달되는 현상을 가리켜 '스택 풀기' 라고 한다.
위 예제는 예외가 발생할 수밖에 없다. 함수 호출 순서는 이렇다.
main -> one -> two -> thr
그리고 thr함수에선 무조건 예외를 발생시킨다. 그런데 이 예외를 처리하기 위한 try~catch 문이 main 함수에 정의되어 있어서 main으로 예외 데이터가 전달된다.
이렇듯 예외가 처리될 때까지, 호출된 함수의 역순으로 예외 데이터가 전달된다. 그리하여 결국 예외는 thr함수에서 발생했지만, 예외의 처리는 main 함수에서 이뤄지는 형태가 된다.
그런데 예외 데이터가 전달되면, 예외 데이터를 전달한 함수는 종료되기 때문에, 예외 데이터를 전달한 함수의 스택이 반환되는 것은 당연하다. 그래서 예외 데이터의 전달을 가리켜 '스택 풀기(스택의 반환)'라고 하는 것이다.
※ 만약 main 함수에 try~catch 문을 삭제하면... 즉, 예외상황이 발생했는데 이를 처리하지 않으면 어떻게 될까?
- 예외가 처리되지 않아서, 예외 데이터가 main 함수에까지 도달했는데, main 함수에서조차 예외를 처리하지 않으면, terminate 함수(프로그램을 종료시키는 함수) 가 호출되면서 프로그램이 종료되어 버린다.
'Programming > C++' 카테고리의 다른 글
예외상황을 표현하는 예외클래스의 설계 (0) | 2012.10.24 |
---|---|
하나의 try 블록과 다수의 catch 블록 (0) | 2012.10.24 |
예외처리(Exception Handling) (0) | 2012.10.17 |
템플릿과 static (0) | 2012.10.17 |
템플릿 인자 (0) | 2012.10.16 |