어떤 try블록이 예외를 발생시키는 함수를 직접 호출하지 않고 그 예외를 발생시키는 함수를 호출하는 다른 함수를 호출한다면 어떻게 될까요?

그 예외는 예외가 발생한 함수로부터 try 블록과 핸들러가 들어 있는 함수로 점프합니다.

이과정에서 스택 풀기(unwinding the stack)이라는 것이 관여합니다.

 

스택풀기

먼저 지역변수는 return(또는 함수의 종료)을 만나야 스택에서 해제됩니다.

그리고 리턴하는 함수가 스택에 올려놓은 것만 처리합니다.

반면에 예외가 발생하여 스택 풀기가 되면 try 블록에 들어 있는 리턴 주소에 도달할 때까지 계속해서 스택을 해제합니다.

즉 try 블록과 throw구문 사이에 개입된 함수 호출들의 전체적인 연쇄가 스택에 올려놓은 객체들을 모두 처리합니다.

return과 마찬가지로 스택에 올라와있는 모든 자동 클래스 객체들에 대해서 클래스 파괴자들이 호출됩니다.

 

스택 풀기 기능이 없다면

throw 구문은 중간에 개입된 함수 호출들이 스택에 올려 놓은 자동 클래스 객체들에 대해서 파괴자를 호출하지 않고 그대로 스택에 남겨두게 될 겁니다.

그리고 만약에 핸들러가 없으면 프로그램은 먹통이 됩니다.

댓글을 달아 주세요