본문 바로가기
IT창고/API

예외처리/GetExceptionCode()

by 창구창고 2007. 1. 22.
반응형
#include<windows.h>
#include<stdio.h>

int n = 0;
void main()
{
        int s;
        __try
        {/*
        s = 10 /n;

        printf("결과 : %d\n",s);
        */
                char *p = 0;
                *p = 'a';//access violation(잘못된 메모리 참조) 결국 0xc00000005번 예외
        }
        __except(1)
        {
                printf("예외발생 : 0x%0x\n",GetExceptionCode()); //에러 코드를 알고자 할때 GetExceptinCode();
        }
        printf("프로그램 계속 실행\n");
}
/*위 코드는 죽는다. 왜 죽을까??
10을 0으로 나누는 명령은 DIV 10,0이다.
CPU는 0으로 나눌수 없다는 것을 알고 트랩을 발생한다.
  ※트랩 : 인터럽트와 비슷하나 CPU가 발생시키는것이다.
트랩핸들러는 운영체제가 지원해주는것이다.
CPU가 문제를 발생 시키면 트랩핸들러로 왔다가 프로그램으로 예외를 전달한다.
그런데 이 예외를 잡지 않아 죽는것이다.
__try, __except() <~ 잡는데는 두가지를 사용한다.
*/

/*
#include<windows.h>
#include<stdio.h>

int n = 0;
/*
//SEH : Structual Exception Handling 구조화된 예외처리 핸들러..
//kernel32.dll의 StartOfProcess(또는 어떤 책에는 BaseProcessStart())
StartOfProcess()
{
        __try
        {
                mainCRTStartup();
        }
        __except(UnhandledExceptionFilter(GetExceptionInforamtion());
        {
                ExitProcess(0);
        }
}
DWROD UnhandledExceptionFilter(_EXCEPTION_POINTERS *P)
{
        UINT ret = MessageBox(hwnd,"알수 없는 예외가 발생했습니다. 디버그 하시려면 취소를 종료하시려면 확인을 눌러주세요","",MBOKCANCEL);
        if(ret == IDCANCEL)1;
                ///디버거를 띄우고 이 프로세스를 연결한다.
        else if(ret == IDOK)
                return 1;// 핸들러 수행

}
*/
DWORD ExceptionFilter(DWORD code)
{
        if(code == EXCEPTION_INT_DEVIDE_BY_ZERO )
        {
                printf("0으로 나누는 예외 발생, 새로운 값을 넣어 주세요 >>");
                scanf("%d",&n);

                return -1;//예외의 원인을 수정했으므로 예외난 곳을 다시 실행하라.
        }
        return 1;//처리할 수 없는 예외이므로 핸들러를 수행한다.
}
void main()
{
        int s;
        __try
        {
        s = 10 /n;

        printf("결과 : %d\n",s);
        /*        char *p = 0;
                *p = 'a';//access violation(잘못된 메모리 참조) 결국 0xc00000005번 예외*/
        }
        __except(ExceptionFilter(GetExceptionCode()))
        {
                printf("예외발생 : 0x%0x\n",GetExceptionCode()); //에러 코드를 알고자 할때 GetExceptinCode(); <~__except()의 괄호 안이나
                                                                                                                //구문안에서만 써야한다.
                                                                                                                //__except()안에 -1을 주면 다시한번 실행하라는것이다.1을주면 예외던져주기
        }
        printf("프로그램 계속 실행\n");
}
/*위 코드는 죽는다. 왜 죽을까??
10을 0으로 나누는 명령은 DIV 10,0이다.
CPU는 0으로 나눌수 없다는 것을 알고 트랩을 발생한다.
  ※트랩 : 인터럽트와 비슷하나 CPU가 발생시키는것이다.
트랩핸들러는 운영체제가 지원해주는것이다.
CPU가 문제를 발생 시키면 트랩핸들러로 왔다가 프로그램으로 예외를 전달한다.
그런데 이 예외를 잡지 않아 죽는것이다.
__try, __except() <~ 잡는데는 두가지를 사용한다.
*/
반응형

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."