개발/윈도우
                
              Exception Handler 등록 처리 방법
                -=HaeJuK=-
                 2024. 7. 29. 16:07
              
              
                    
        728x90
    
    
  반응형
    
    
    
  
SetUnhandledExceptionFilter
설명:
- 용도: Windows 운영 체제에서 발생하는 하드웨어 예외와 같은 낮은 수준의 예외를 처리하기 위해 사용됩니다.
- 등록 방법: SetUnhandledExceptionFilter 함수를 호출하여 전역 예외 처리기를 등록합니다.
#include <windows.h>
#include <stdio.h>
LONG WINAPI MyExceptionHandler(EXCEPTION_POINTERS* ExceptionInfo) {
    printf("Unhandled exception occurred! Exception code: 0x%08X\n", ExceptionInfo->ExceptionRecord->ExceptionCode);
    return EXCEPTION_EXECUTE_HANDLER;
}
int main() {
    SetUnhandledExceptionFilter(MyExceptionHandler);
    int* p = NULL;
    *p = 42; // 예외 발생
    return 0;
}
구조화된 예외 처리 (Structured Exception Handling, SEH)
설명:
- 용도: 코드 블록 내에서 발생하는 예외를 처리하기 위해 사용되는 Windows의 예외 처리 구조입니다.
- 등록 방법: __try와 __except 블록을 사용하여 예외 처리기를 정의합니다.
#include <windows.h>
#include <stdio.h>
int main() {
    __try {
        int* p = NULL;
        *p = 42; // 예외 발생
    } __except (EXCEPTION_EXECUTE_HANDLER) {
        printf("Exception occurred!\n");
    }
    return 0;
}
std::set_terminate
설명:
- 용도: C++에서 예외가 catch되지 않았을 때 프로그램이 종료되기 전에 호출될 함수를 설정하기 위해 사용됩니다.
- 등록 방법: std::set_terminate 함수를 호출하여 전역 종료 처리기를 등록합니다.
#include <iostream>
#include <exception>
void MyTerminateHandler() {
    std::cerr << "Unhandled exception! Program will terminate." << std::endl;
    std::abort();
}
int main() {
    std::set_terminate(MyTerminateHandler);
    try {
        throw std::runtime_error("An error occurred!");
    } catch (const std::exception& e) {
        std::cerr << "Exception caught: " << e.what() << std::endl;
    }
    throw std::runtime_error("Unhandled exception!"); // 예외 발생
    return 0;
}
차이점
- 언어 레벨 차이:
- SetUnhandledExceptionFilter: Windows API (C 언어 기반)에서 제공, 하드웨어 예외 처리.
- SEH: Windows 환경에서 C/C++ 언어를 사용한 구조화된 예외 처리.
- std::set_terminate: C++ 표준 라이브러리, C++ 예외 처리 시스템과 통합.
 
- 용도 차이:
- SetUnhandledExceptionFilter: 시스템 레벨의 하드웨어 예외 처리.
- SEH: 코드 블록 내 특정 예외 처리.
- std::set_terminate: C++ 예외가 catch되지 않았을 때 호출될 함수 설정.
 
- 호출 시점 차이:
- SetUnhandledExceptionFilter: 운영 체제에서 예외가 발생하고 애플리케이션에서 처리되지 않을 때.
- SEH: 코드 블록 내에서 예외가 발생할 때.
- std::set_terminate: C++ 예외가 catch되지 않았을 때.
 
728x90