반응형
#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() <~ 잡는데는 두가지를 사용한다.
*/
#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() <~ 잡는데는 두가지를 사용한다.
*/
반응형
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."