본문 바로가기
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() <~ 잡는데는 두가지를 사용한다.
    */
    반응형

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