본문 바로가기
IT창고/System

에러처리 기법

by 창구창고 2007. 1. 22.
반응형
/*
1. 실행가능한 파일을 프로그램이라한다.
2. 프로그램이 하나 실행되면 하나의 프로세스가 된다.
   같은 프로그램이라도 2번실행되면 프로세스는 2개가 된다.
3. 프로세서는 CPU를 말한다.
4. 프로세스 하나당 쓰레드 하나가 생성된다.
5. 에러 전역변수는 프로세스당 하나라서 스레드가 2개일때 하나의 스레드가 처리하기 전에 
   다른 스레드가 에러를 발생하면 먼저 에러를 발생한 스레드의 에러는 알수가 없다.
6. 그레서 스레드당 하나의 에러전역변수를 지원해주는것이 있다. GetLastError();
7. 브레이크 포인트(F9)하고 서치창에 @err과 @err,hr를 넣으면 에러를 알수 있다.
8. 성공시에도 GetLastError호출할때가 있다.
*/

#include<stdio.h>
#include<conio.h>
#include<windows.h>
//함수호출이 성공했을때에서 성공의 이유를 알기 위해서 GetLsatError()를 호출할 때가 있다.- 항상 그런것은 어니다.
//동시에 동일한 2개의 프로세스가 생성되는 것을 막는 방법
void main()
{
	HANDLE hEvent	=	CreateEvent(0,0,0,"e");
	if(hEvent != 0 )//성공이면
	{
		DWORD e = GetLastError();

		if( e == ERROR_ALREADY_EXISTS)
		{
			printf("이미존재하는 Event 객체를 Open 했습니다.\n");
			printf("이미 응용 프로그램이 실행중입니다.\n");
			return;
		}
		else
		{
			printf("Event 객체를 새롭게 생성했습니다.\n");
		}
	}
	getch(); // #include<conio.h>를 추가해 주세요 
}
/*
void main()
{
	HWND hwnd = CreateWindow(0,0,0,0,0,0,0,0,0,0,0);

	if(hwnd == 0)//실패면
	{
		DWORD e = GetLastError();	//Thread 당 하나씩 존재하는 에러 코드를 얻는다.
		printf("FAIL : %d\n",e);

		char *s;//포인터만 전달하고 필요한 만큼 API함수가  할당하게 하는 기법
		//좀 어렵지만 고ㄱㅂ 기법 이므로 알아둘 필요있음
		FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM
			| FORMAT_MESSAGE_ALLOCATE_BUFFER,//API시스템이 버퍼크기를 정한다.
			0,//문자열을 가진 DLL핸들(0: 시스템으로부터 얻는다.)
			e,//에러번호
			0,//언어
			(char *)s,0,//버퍼, 버퍼크기
			0); //va_list형 변수로얻을때 사용
		printf("%s\n",s);

		//FormatMessage()는 내부적으로 LocalFree() 사용하여 메모리를 할당한다. 해지는 사용자 책임
		LocalFree(s);
	}
}*/

/*//전통적인 에러처리방법
void main()
{
	FILE * f = fopen("a.txt","rt");
	if(f == 0 )
	{
		printf("실패");
		//어떤함수든지 실패를 하면 어떤게 실패했는지 번호를 알려해주는 함수가 있다.
		printf("에러 = %d\n",errno);
		char *s = strerror(errno);
		printf("%s \n",s);	//<<~ 무슨에러인지 문자열로 알려준다. (errno -> 문자열로)

		perror("Fail"); //fprintf(stderror, "Fail : %s\n",strerror(errno));
	}
}*/
반응형

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