Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++에서 처리되지 않은 예외(uncaught exception)의 종료 동작 사용자 정의하기

이 튜토리얼에서는 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()는 프로그램 시작 시 최대한 초기에 호출하는 것이 안전하며, 스레드별로 독립적인 핸들러가 적용될 수 있으므로 멀티스레드 환경에서는 주의가 필요합니다.