윈도우에서는 함수가 반환하는 데이터의 종료에 따라 다르게 처리한다.
데이터 타입 | 실패를 나타내는 반환 값 |
---|---|
VOID | VOID를 반환하는 함수는 실패하지 않는 함수들이다. 윈도우에서 VOID를 반환하는 함수는 굉장히 적다. |
BOOL | 윈도우에서 BOOL은 실제로는 INT와 같기 때문에 함수가 실패하면 0을, 성공하면 0이 아닌 값을 반환한다. 때문에 반환값 == TRUE 를 확인하는 대신, 반환값 != FALSE 를 확인하는 것이 좋다. |
HANDLE | 함수가 실패하면 NULL, 혹은 INVALID_HANLDE_VALUE를 반환한다. 성공하면 객체의 HANDLE을 반환한다. |
PVOID | 실패하면 NULL, 성공하면 데이터의 메모리 주소를 반환한다. |
LONG/DWORD | 실패하면 0 혹은 -1을 반환한다. 문서를 확인할 것을 권고한다. |
함수가 실패하는 경우에는 DWORD GetLastError();
를 이용해서 에러에 대해 더 자세히 알 수 있다. 윈도우가 제공하는 에러 코드 목록을 참조하면 된다. 다른 함수들이 값을 덮어 쓸 수 있으므로, 문제가 생기면 이 함수를 바로 호출해서 에러 코드를 확인 하는 것이 좋다. 심지어 성공적으로 작동한 함수들도 ERROR_SUCCESS
로 값을 설정하거나, 함수가 성공한 이유를 알려주기 위해서 값을 ERROR_ALREADY_EXISTS
와 같은 값으로 설정하기도 한다.
DWORD FormatMessage (
DWORD dwFlags,
LPCVOID pSource,
DWORD dwMessageId,
DWORD dwLanguageId,
PTSTR pszBuffer,
DWORD nSize,
va_list *Arguments
)
위의 함수를 이용해서 에러코드로 에러의 구체적인 설명을 구할 수 있다.
윈도우가 제공하는 에러 코드 목록에 필요로 하는 에러 코드가 없을 경우, 새로운 에러코드를 만들 수 있다. 에러 코드는 32비트인데, 아래와 같이 정의되어 있다.
비트 | 내용 | 의미 |
---|---|---|
31-30 | 심각도 | 0 = 성공 1 = 정보 2 = 주의 3 = 에러 |
29 | MS/고객 | 0 = MS 정의 코드 1 = 고객 정의 코드 |
28 | 예약됨 | 항상 0 |
27 - 16 | 식별 코드 | 첫 256의 값들은 MS가 예약함 |
15 - 0 | 예외 코드 | MS 혹은 고객이 정의한 코드 |