예외를 설명합니다.
구문
typedef struct _EXCEPTION_RECORD {
DWORD ExceptionCode;
DWORD ExceptionFlags;
struct _EXCEPTION_RECORD *ExceptionRecord;
PVOID ExceptionAddress;
DWORD NumberParameters;
ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
} EXCEPTION_RECORD;
멤버
ExceptionCode
예외가 발생한 이유입니다. 하드웨어 예외에 의해 생성된 코드이거나 소프트웨어 생성 예외에 대해 RaiseException 함수에 지정된 코드입니다. 다음 표에서는 일반적인 프로그래밍 오류로 인해 발생할 수 있는 예외 코드를 설명합니다.
값 |
의미 |
-
EXCEPTION_ACCESS_VIOLATION
|
스레드가 적절한 액세스 권한이 없는 가상 주소에서 읽거나 쓰려고 했습니다.
|
-
EXCEPTION_ARRAY_BOUNDS_EXCEEDED
|
스레드는 범위를 벗어난 배열 요소에 액세스하려고 시도했으며 기본 하드웨어는 경계 검사를 지원합니다.
|
-
EXCEPTION_BREAKPOINT
|
중단점이 발견되었습니다.
|
-
EXCEPTION_DATATYPE_MISALIGNMENT
|
스레드는 정렬을 제공하지 않는 하드웨어에서 잘못 정렬된 데이터를 읽거나 쓰려고 했습니다. 예를 들어 16비트 값은 2 바이트 경계에 맞춰야 합니다. 4 바이트 경계의 32비트 값 등
|
-
EXCEPTION_FLT_DENORMAL_OPERAND
|
부동 소수점 연산의 피연산자 중 하나는 비정규입니다. 비정규 값은 표준 부동 소수점 값으로 표현하기에는 너무 작은 값입니다.
|
-
EXCEPTION_FLT_DIVIDE_BY_ZERO
|
스레드는 부동 소수점 값을 0의 부동 소수점 수로 나누려고 했습니다.
|
-
EXCEPTION_FLT_INEXACT_RESULT
|
부동 소수점 연산의 결과는 10진수 분수로 정확하게 나타낼 수 없습니다.
|
-
EXCEPTION_FLT_INVALID_OPERATION
|
이 예외는 이 목록에 포함되지 않은 부동 소수점 예외를 나타냅니다.
|
-
EXCEPTION_FLT_OVERFLOW
|
부동 소수점 연산의 지수는 해당 형식에서 허용하는 크기보다 큽습니다.
|
-
EXCEPTION_FLT_STACK_CHECK
|
부동 소수점 작업의 결과로 스택이 오버플로되거나 언더플로됩니다.
|
-
EXCEPTION_FLT_UNDERFLOW
|
부동 소수점 연산의 지수가 해당 형식에서 허용하는 크기보다 작습니다.
|
-
EXCEPTION_ILLEGAL_INSTRUCTION
|
스레드가 잘못된 명령을 실행하려고 했습니다.
|
-
EXCEPTION_IN_PAGE_ERROR
|
스레드가 존재하지 않는 페이지에 액세스하려고 했지만 시스템에서 페이지를 로드할 수 없습니다. 예를 들어 네트워크를 통해 프로그램을 실행하는 동안 네트워크 연결이 끊어지면 이 예외가 발생할 수 있습니다.
|
-
EXCEPTION_INT_DIVIDE_BY_ZERO
|
스레드는 정수 값을 0의 정수 수로 나누려고 했습니다.
|
-
EXCEPTION_INT_OVERFLOW
|
정수 연산의 결과로 결과의 가장 중요한 비트가 수행되었습니다.
|
-
EXCEPTION_INVALID_DISPOSITION
|
예외 처리기가 예외 디스패처에 잘못된 처리를 반환했습니다. C와 같은 고급 언어를 사용하는 프로그래머는 이 예외가 발생하지 않아야 합니다.
|
-
EXCEPTION_NONCONTINUABLE_EXCEPTION
|
스레드는 연결할 수 없는 예외가 발생한 후 실행을 계속하려고 했습니다.
|
-
EXCEPTION_PRIV_INSTRUCTION
|
스레드는 현재 컴퓨터 모드에서 작업이 허용되지 않는 명령을 실행하려고 했습니다.
|
-
EXCEPTION_SINGLE_STEP
|
추적 트랩 또는 다른 단일 명령 메커니즘은 하나의 명령이 실행되었음을 알 수 있습니다.
|
-
EXCEPTION_STACK_OVERFLOW
|
스레드는 스택을 사용했습니다.
|
콘솔 프로세스 디버깅 시 또 다른 예외 코드가 발생할 수 있습니다. 프로그래밍 오류로 인해 발생하지 않습니다.
DBG_CONTROL_C 예외 코드는 Ctrl+C 신호를 처리하고 디버그하는 콘솔 프로세스에 Ctrl+C가 입력될 때 발생합니다. 이 예외 코드는 애플리케이션에서 처리할 수 없습니다. 디버거의 이점을 위해서만 발생하며 디버거가 콘솔 프로세스에 연결된 경우에만 발생합니다.
ExceptionFlags
이 멤버에는 0개 이상의 예외 플래그가 포함되어 있습니다. 다음 표에서는 일반적으로 표시되는 일부 예외 플래그에 대해 설명합니다. 다음 표에 없는 예외 플래그는 시스템 사용을 위해 예약된 것으로 처리해야 합니다.
예외 플래그 |
의미 |
-
EXCEPTION_NONCONTINUABLE
|
이 플래그의 존재는 예외가 지속 불가능한 예외임을 나타내는 반면, 이 플래그가 없으므로 예외가 연속 가능한 예외임을 나타냅니다.
연결할 수 없는 예외 후 실행을 계속하려고 하면 EXCEPTION_NONCONTINUABLE_EXCEPTION 예외가 발생합니다.
|
-
EXCEPTION_SOFTWARE_ORIGINATE
|
이 플래그는 시스템 사용을 위해 예약되어 있습니다.
|
ExceptionRecord
연결된 EXCEPTION_RECORD 구조체에 대한 포인터입니다. 중첩된 예외가 발생할 때 추가 정보를 제공하기 위해 예외 레코드를 함께 연결할 수 있습니다.
ExceptionAddress
예외가 발생한 주소입니다.
NumberParameters
예외와 연결된 매개 변수 수입니다.
ExceptionInformation 배열에 정의된 요소의 수입니다.
ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]
예외를 설명하는 추가 인수의 배열입니다.
RaiseException 함수는 이 인수 배열을 지정할 수 있습니다. 대부분의 예외 코드에서 배열 요소는 정의되지 않습니다. 다음 표에서는 배열 요소가 정의된 예외 코드에 대해 설명합니다.
예외 코드 |
의미 |
-
EXCEPTION_ACCESS_VIOLATION
|
배열의 첫 번째 요소에는 액세스 위반을 일으킨 작업 유형을 나타내는 읽기-쓰기 플래그가 포함되어 있습니다. 이 값이 0이면 스레드가 액세스할 수 없는 데이터를 읽으려고 했습니다. 이 값이 1이면 스레드가 액세스할 수 없는 주소에 쓰려고 했습니다.
이 값이 8이면 스레드에서 DEP(사용자 모드 데이터 실행 방지) 위반이 발생했습니다.
두 번째 배열 요소는 액세스할 수 없는 데이터의 가상 주소를 지정합니다.
|
-
EXCEPTION_IN_PAGE_ERROR
|
배열의 첫 번째 요소에는 액세스 위반을 일으킨 작업 유형을 나타내는 읽기-쓰기 플래그가 포함되어 있습니다. 이 값이 0이면 스레드가 액세스할 수 없는 데이터를 읽으려고 했습니다. 이 값이 1이면 스레드가 액세스할 수 없는 주소에 쓰려고 했습니다.
이 값이 8이면 스레드에서 DEP(사용자 모드 데이터 실행 방지) 위반이 발생했습니다.
두 번째 배열 요소는 액세스할 수 없는 데이터의 가상 주소를 지정합니다.
세 번째 배열 요소는 예외를 초래한 기본 NTSTATUS 코드를 지정합니다.
|
디버거가 다른 아키텍처(32비트 및 64비트)에서 실행되는 대상을 디버그할 수 있도록 하려면 이 구조체의 명시적 형식 중 하나를 사용합니다.
typedef struct _EXCEPTION_RECORD32 {
DWORD ExceptionCode;
DWORD ExceptionFlags;
DWORD ExceptionRecord;
DWORD ExceptionAddress;
DWORD NumberParameters;
DWORD ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
} EXCEPTION_RECORD32, *PEXCEPTION_RECORD32;
typedef struct _EXCEPTION_RECORD64 {
DWORD ExceptionCode;
DWORD ExceptionFlags;
DWORD64 ExceptionRecord;
DWORD64 ExceptionAddress;
DWORD NumberParameters;
DWORD __unusedAlignment;
DWORD64 ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
} EXCEPTION_RECORD64, *PEXCEPTION_RECORD64;
요구 사항
|
|
지원되는 최소 클라이언트 |
Windows XP [데스크톱 앱 | UWP 앱] |
지원되는 최소 서버 |
Windows Server 2003 [데스크톱 앱 | UWP 앱] |
머리글 |
winnt.h(Windows.h 포함) |
추가 정보
EXCEPTION_DEBUG_INFO
EXCEPTION_POINTERS
GetExceptionInformation
RaiseException
UnhandledExceptionFilter