[c++] C++ 예외 처리의 내부 동작

C++에서 예외 처리는 프로그램에서 발생하는 예외 상황을 처리하는데 사용됩니다. 예외 처리는 예외가 발생할 수 있는 코드 블록을 감싸는 try 블록, 예외를 발생시키는 throw 문, 그리고 예외를 처리하는 catch 블록으로 구성됩니다.

throw 문의 역할

throw 문은 프로그램 실행 중에 예외를 발생시키는 데 사용됩니다. 예외는 throw 문에 의해 발생된 다음 가장 가까운 try 블록에서 처리될 수 있습니다. 만약 가장 가까운 try 블록에서 해당 예외를 처리할 수 있는 catch 블록이 없다면, 예외는 상위 호출 스택으로 전파됩니다.

아래는 throw 문을 사용하여 예외를 발생시키는 예제 코드입니다.

try {
    int errCode = 1;
    if (errCode != 0) {
        throw "Error occurred"; // 예외 발생
    }
} catch (const char* errMsg) {
    std::cout << "Caught exception: " << errMsg << std::endl;
}

catch 블록의 처리 과정

catch 블록은 try 블록에서 발생한 예외를 처리하는 데 사용됩니다. catch 블록은 해당 예외 타입과 일치하는 경우에만 예외를 처리합니다.

만약 예외가 발생한 후 해당 예외를 처리할 수 있는 catch 블록이 없다면, 호출 스택을 거슬러 올라가며 예외를 처리할 수 있는 catch 블록을 찾습니다. 만약 호출 스택의 맨 꼭대기까지 이동해도 처리할 수 있는 catch 블록이 없다면, 프로그램은 예외에 의해 종료됩니다.

예외를 처리하는 catch 블록도 throw 문과 마찬가지로 해당 예외를 처리한 후 추가적인 처리나 예외를 다시 발생시킬 수 있습니다.

내부 동작

C++ 컴파일러는 예외 처리를 구현할 때 보통 예외 테이블을 사용합니다. 이 테이블은 try 블록에서 발생한 예외와 각 catch 블록이 처리할 예외 타입을 매핑하는 데 사용됩니다. 현재의 스택 프레임과 예외 테이블을 확인하여 어떤 catch 블록이 호출 스택에 있는 예외를 처리하는지 결정합니다.

또한 예외가 발생하면 호출 스택의 각 프레임은 해당 예외를 처리할 수 있는 catch 블록을 찾기 위해 역순으로 순회됩니다. 이를 통해 프로그램은 가장 가까운 catch 블록을 찾아 해당 예외를 처리할 수 있습니다.

C++ 예외 처리의 내부 동작은 각각의 호출 스택 프레임과 프로그램의 예외 테이블 간의 상호작용으로 구성되어 있습니다. 이를 통해 프로그램은 예외를 제어 및 처리할 수 있습니다.

결론

C++ 예외 처리는 throw 문과 catch 블록을 통해 예외를 발생시키고 처리합니다. 내부적으로는 호출 스택 프레임과 예외 테이블 간의 상호작용으로 동작하며, 프로그램은 예외를 효과적으로 제어하고 처리할 수 있습니다.