사용자 정의 함수를 통한 에러 내용 전달 




 C 런타임 라이브러리는 인자의 유효성 검증이 실패하였을 경우 사용자가 정의한 함수를 통해
에러 내용을 전달할 수 있는 기능을 제공하고 있다. 이러한 함수를 이용하면 에러를 기록하거나
디버거를 기동하는 등의 사용자 작업을 수행할 수 있다.


■ 사용 단계
1. 사용할 함수의 원형을 작성한다.
    void InvalidParameterHandler(PCTSTR expression, 
                                 PCTSTR function, 
                                 PCTSTR file, 
                                 unsigned int line, 
                                 uintptr_t pReserved);


       expression  : C런타임 함수 내에서 발생한 테스트 실패에 대한 설명 문자열 전달
       function       : 함수 이름
       file              : 소스 파일 명
       line             : 에러가 발생한 소스코드의 행 번호
       pReserved   : 예약어


2. _set_invalid_parameter_handler 를 호출하여 앞서 작성한 함수를 등록
_invalid_parameter_handler newHandler = InvalidParameterHandler;
_invalid_parameter_handler oldHandler = _set_invalid_parameter_handler(newHandler);



3. _CrtSetReportMode(_CRT_ASSERT, 0) 을 어플리케이션 시작 시점에 호출하여 C런타임 Assertion 다이얼로그 박스가
   나타나지 않도록 한다.
     _CrtSetReportMode(_CRT_ASSERT, 0);


4. String.h 에 정의된 기존 문자열 함수를 대처하는 안전 문자열 함수들을 사용
   호출한 함수가 정상 수행되었는지의 여부를 확인하려면 반환되는 errno_t 값을 확인하면 됨.
   S_OK 가 반환 되면 함수가성공한 것임.
   그 외에 다른 값은 errno.h 에 정의되어 있음.



■ 예제 소스

#include "stdafx.h"
#include <Windows.h>                    /**< Using Windows Data Type       */
#include <crtdbg.h>                     /**< Using _CrtReportMode() Option */



void InvalidParameterHandler(PCTSTR expression, PCTSTR function, PCTSTR file, 
                             unsigned int line, uintptr_t pReserved);



int _tmain(int argc, _TCHAR* argv[])
{
    TCHAR   szBefore[5]  = {_T('B'), _T('B'), _T('B'), _T('B'), _T('\0')};
    TCHAR   szBuffer[10= {_T('-'), _T('-'), _T('-'), _T('-'), _T('-'), 
                            _T('-'), _T('-'), _T('-'), _T('-'), _T('\0')};
    TCHAR   szAfter[5]   = {_T('A'), _T('A'), _T('A'), _T('A'), _T('\0')};
    errno_t result       = 0;


    /**< CRT가 Assertion 다이얼 로그를 출력하지 못하게 함 */
    _CrtSetReportMode(_CRT_ASSERT, 0);


    /**< 사용자 정의 핸들러 등록 */
    _invalid_parameter_handler newHandler = InvalidParameterHandler;
    _invalid_parameter_handler oldHandler = _set_invalid_parameter_handler(newHandler);


    /**< CRT 함수 실패 소스 */
    result = _tcscpy_s(szBuffer, _countof(szBuffer), _T("0123456789"));


    /**< CRT 의 기본 핸들러 복원 */
    _set_invalid_parameter_handler(oldHandler);

  return EXIT_SUCCESS;
}




/*
 @param

[in]    expression : CRT 함수 내에서 발생한 테스트 실패에 대한 설명 문자열  
[in]    function   : 실패를 발생시킨 CRT 함수 이름                         
[in]    file       : 소스 파일 이름
                                        
[in]    line       : 에러가 발생한 소스 코드의 행 번호
[out]   pReserved  : 예약어
 @return    void
 @note      사용자 정의한 유효 파라미터 핸들러
 @note      이 핸들러는 CRT가 유효 파라미터 검사를 수행할 때 기본 핸들러 대신 수행
*/

void InvalidParameterHandler(PCTSTR expression, PCTSTR function, PCTSTR file, 
                             unsigned int line, uintptr_t pReserved)
{
    wprintf(_T("Invalid parameter detected in function %s.\n"), function);
    wprintf(_T("File: %s Line: %d\n"), file, line);
    wprintf(_T("Expression: %s\n"), expression);
    exit(EXIT_FAILURE);
}




■ 출력 예






cf) MSDN, WINDOWS VIA C/C++ - 한빛 미디어

Posted by six605
,