예외 전파
아무도 받지 않은 예외는 어떻게 될까?
화면을 누르면 다음 장으로 넘어갑니다
되짚기: 호출 스택
부르면 쌓이고 끝나면 걷힙니다
함수를 부르면 그 함수가 쓸 칸이 스택(stack)에 쌓이고, 끝나면 걷힙니다. main이 f를, f가 g를 부르면 세 층이 됩니다. 어느 층이든 바로 아래층이 그것을 부른 쪽입니다.
스택은 4강에서 본 대로, 나중에 넣은 것을 먼저 꺼내는 구조입니다. main은 C++ 프로그램이 실행을 시작하는 함수입니다.
전파
처리기를 찾아 한 층씩 내려갑니다
예외가 난 함수에 맞는 처리기가 없으면 예외는 그 함수를 부른 쪽으로 넘어갑니다. 1편에서 본 예외 전파입니다. 처리하지 못한 함수는 거기서 끝나 스택에서 걷히고, 예외는 맞는 처리기를 만날 때까지 내려갑니다.
예시입니다. f의 catch (int)는 double과 타입이 맞지 않아 지나칩니다.
끝까지 없으면
main에도 없으면 프로그램이 끝납니다
전파는 main 함수까지 이어집니다. main에서도 처리기를 찾지 못하면 기본 처리기(default handler)가 불립니다. C++의 기본 처리기 unexpected는 프로그램을 종료하고, 프로그래머가 다른 동작으로 바꿔 둘 수 있습니다.
처리 뒤
마지막 catch 다음에서 이어 갑니다
처리기가 끝나면 실행은 그 try에 딸린 마지막 catch 절의 다음 문장으로 갑니다. 어느 catch가 받았든 같은 곳입니다. 예외가 난 자리로 돌아가지 않으니 3편에서 본 종료 방식입니다.
예시 코드입니다. f()가 double 타입의 값을 던진 경우이고, next()는 try 구조 다음의 문장입니다.
C++의 선택
던질 예외를 적어도 되고 안 적어도 됩니다
C++에서는 모든 예외가 사용자 정의이고, 예외를 미리 알려 두는 선언도 하지 않습니다. 함수는 던질 수 있는 예외를 함수의 첫 줄에 throw 절로 나열할 수 있고, throw 절이 없으면 무엇이든 던질 수 있습니다.
예시 코드입니다. void는 돌려주는 값이 없다는 표시이고, 사용자 정의는 프로그래머가 직접 정한다는 뜻입니다.
평가
C++ 방식의 아쉬운 점 넷
이 강의가 따르는 교재는 C++의 예외 처리에서 네 가지를 아쉬운 점으로 꼽습니다. 자바는 이 방식을 바탕으로 하되 다르게 설계했습니다.
시스템 소프트웨어는 운영체제처럼 컴퓨터를 움직이는 바탕 프로그램입니다.
다음 편