본문 바로가기

Study/Windows System Programming

[Windows VIA C/C++] 1. 에러 핸들링

 

이 글은 책 "제프리 리처의 Windows via c/c++"을 보고 작성한 글 입니다.

 

 

윈도우 함수를 호출하면 호출된 함수는 인자의 유효성을 먼저 확인하고 함수의 기능을 수행하려 한다.

이 때 유효성이 확인되지 않으면 함수가 실패하는데, 왜 함수가 실패했느지의 여부를 알아내는 과정이 반드시 필요하다.

윈도우 함수가 실패하게되면 내부적으로 함수를 호출한 스레드의 스레드 지역 저장소에 적절한 에러코드를 저장해둔다. 따라서 여러 개의 스레드가 동시에 수행될 경우라도 항호간에 영향을 미치지 않고 각 스레드별로 에러 코드를 유지할 수 있게 된다.

 

함수 호출이 실패하면 관련 에러 코드를 획득하기 위해 지체없이 GetLastError를 호출해야한다. 이 함수를 호출하기 전에 다른 함수를 호출하게 되면 다른 함수의 수행 결과가 겹쳐 써지게 된다.

어플리케이션 중 함수가 어떻게 성공했는지 구분이필요할 수 있는데, 이 또한 GetLastError를 통하여 확인할 수 있다.

 

디버그 도중 에러코드를 확인할 때에는 디버그-창-조사식 에서 현재 수행중인 스레드의 마지막 에러 코드와 메시지 텍스트를 확인할 수 있는 기능을 제공한다.

 

Error Lookup을 이용하여 에러 코드에 해당하는 메시지 텍스트를 쉽게 확인할 수 있고, FormatMessage를 이용하여 사용자에게 에러에 대한 설명을 보여줄 수 있다.

 

 

1. 자신만의 에러 코드를 정의하는 방법

개발하는 함수는 실패했을 경우 실패의 원인을 호출자에게 반환하도록 작성되어야 한다.

MS에서 제공하는 WinError.h안에 에러의 원인이 정의되어있지만, 직접 에러코드를 만들어야 한다면, '에러 코드 필드'의 29번 비트를 반드시 1로 설정해주어야 한다. (MS의 코드와 겹치지 않기 위해서)