Mafa Dev

에러 핸들링 본문

개발/시스템 프로그래밍

에러 핸들링

마파_ 2013. 3. 12. 01:58

윈도우 함수가 에러를 어떻게 처리하는지에 대해 이해해 봅시다. 윈도우 함수를 호출하면 호출된 함수는 먼저 전달된 인자의 유효성을 확인하고 함수의 기능을 수행하려 합니다. 만일 전달된 인자가 유효하지 않거나 다른 이유로 인해 해당 기능을 수행할 수 없으면 함수는 실패를 반환합니다.

 

윈도우 함수의 대표적인 반환 자료형 입니다.

 

 

자료형 

 실패했을 때의 값

 VOID

  이 함수는 절대 실패하지 않습니다. 아주 적은 윈도우 함수만이 void 형의 반환 자료형을 가집니다. 

 BOOL

  함수가 실패하면 0을 반환합니다. 성공 시에는 0이 아닌 값을 반환합니다. 반환 값을 TRUE와 비교해서는 안됩니다.

 HANDLE

 함수가 실패하면 반환 값은 대개 NULL 입니다. 성공 시에는 유효한 오브젝트 핸들을 반환합니다. 몇몇 함수들은 -1로 정의된 INVALID_HANDLE_VALUE를 반환하는 경우가 있기 때문에 주의가 필요합니다. 플랫폼 SDK 문서에 함수 호출이 실패 했을 때 NULL을 반환하는지 혹은 INVALID_HANDLE_VALUE를 반환하는지에 대해 명확하게 기술되어 있습니다.

 PVOID   함수가 실패하면 NULL을 반환합니다. 성공 시에는 PVOID가 데이터를 저장하고 있는 메모리 주소를 가리킵니다.
 LONG/DWORD

 대게 LONG이나 DWORD형으로 개수를 반환합니다. 어떤 이유로 인해서 개수를 반환하지 못하게 되면 0이나 -1을 반환합니다.(어떤 값을 반환하느냐는 함수별로 각기 다릅니다) 만일 호출하는 함수가 LONG/DWORD 값을 반환하는 경우라면 잠재적인 에러를 미연에 방지하기 위해 플랫폼 SDK 문서를 주의 깊게 살펴보아야 합니다.

 

윈도우 함수가 실패하면 왜 함수가 실패했는지의 여부를 알아내는 과정이 반드시 필요합니다. 마이크로소프트는 발생할 가능성이 있는 모든 에러 코드를 32비트 숫자로 정의해 두었습니다. 호출한 함수가 실패한 것으로 판단되면 어떤 에러가 발생했는지 확인하기 위해 GetLastError 함수를 사용할 수 있습니다. WinError.h 헤더 파일은 마이크로소프트가 정의한 모든 에러 코드의 리스트를 가지고 있습니다. 이 헤더 파일은 거의 39000행이 넘습니다.

 

함수 호출이 실패하면 관련 에러 코드를 획득하기 위해 지체없이 GetLastError를 호출해야 합니다. 만일 이 함수를 호출하기 전에 다른 함수를 호출하게 되면 다른 함수의 수행 결과가 겹쳐 써지게 됩니다. 함수 호출이 성공하면 ERROR_SUCCESS를 에러 코드로 기록합니다.