이 튜토리얼에서는 C++에서 처리되지 않은 예외(uncaught exception)가 발생했을 때 프로그램의 종료 동작을 사용자가 원하는 방식으로 변경하는 방법을 알아봅니다.
처리되지 않은 예외란?
일반적으로 C++에서는 try-catch 블록을 통해 예외를 처리합니다. 하지만 발생한 예외와 일치하는 catch 블록이 존재하지 않으면 프로그램은 곧바로 종료됩니다. 이때 내부적으로 호출되는 것이 바로 terminate() 함수입니다.
중요한 점은 이 terminate() 함수의 기본 동작이 고정되어 있지 않다는 것입니다. <exception> 헤더에 정의된 set_terminate() 함수를 사용하면 종료 핸들러(terminate handler)를 직접 정의하여 기본 동작을 대체할 수 있습니다.
예제 코드
#include <exception>
#include <iostream>
using namespace std;
// 사용자 정의 종료 핸들러
void myhandler(){
cout << "Inside new terminate handler\n";
abort();
}
int main(){
set_terminate(myhandler);
try {
cout << "Inside try block\n";
throw 100;
}
catch (char a){
cout << "Inside catch block\n";
}
return 0;
}실행 결과
Inside try block Inside new terminate handler
코드 설명
위 예제에서는 throw 100;을 통해 int 타입의 예외를 던집니다. 그러나 catch 블록은 char 타입만 받도록 작성되어 있어 예외를 잡지 못합니다.
이처럼 일치하는 핸들러가 없으면 프로그램은 기본적으로 terminate()를 호출하지만, 앞서 set_terminate(myhandler)를 통해 새로운 핸들러를 등록했기 때문에 기본 동작 대신 myhandler()가 실행됩니다. 그 결과 "Inside new terminate handler"라는 메시지가 출력된 후 abort()에 의해 프로그램이 비정상 종료됩니다.
주의 사항
사용자 정의 종료 핸들러는 프로그램을 반드시 종료시켜야 합니다. 핸들러가 반환되면 런타임이 자동으로 abort()를 호출하기 때문입니다. 또한 set_terminate()는 프로그램 시작 시 최대한 초기에 호출하는 것이 안전하며, 스레드별로 독립적인 핸들러가 적용될 수 있으므로 멀티스레드 환경에서는 주의가 필요합니다.