본문 바로가기
프로그래밍

Error Handling

by 건우아빠유리남편 2009. 7. 19.
반응형

//Assert()의 필요성.. 디버깅을 최대한 편하게..


// #  매크로에 대해서..-- 무슨 의미 일까? j 해당 심볼을 문자열로 풀어 달라.
// ##  매크로 - win 32 배울때 사용하게 됩니다.. token paste
// ###  없다
#include <stdio.h>

#define out( x ) printf("%d %d\n", x##1, x##2 );

void main()
{
 int x1 = 10, x2 = 20;
 out( x );
}

 


/*

#define dprint( x ) printf( #x " = %d\n",x);

void main()
{
 int n =10;
 dprint(n/2); //printf("n" " = %d\n",x,n);

 pritnf("aaa" "bbb" "ccc"); //"aaabbbccc
}

 

*/


/*
//assert() 에 대하여 ...
// 1. 미리 정의된 매크로 3개 11번째 줄이 "printf("%d\n",__LINE__);"
// 2. c에 미리 정의된 매크로 : __FILE__,__TIME__,__LINE__

#include <stdio.h>
#include <stdlib.h>
#include <assert.h> // assert() 매크로 함수를 제공해 준다.. 밑에 직접 만들었지만.. ㅡㅡ;;

/*매크로는 같은 줄에 있어야 함.. 그러나 다른 줄에 있으려면.
#define a \
    10
*/

// 디버거 죽이면 어설트가 공백을 호출 하기 때문에..
// 프로그램 커지지 않음.. 개발 다 끝나면 디버거만 죽이면 가능..
//#define DEBUG
/*
#ifdef DEBUG
#define ASSERT( x ) if( !(x) ){\
printf("Assert Failed : %s(%d)\n",__FILE__,__LINE__);\
  exit(-1);}
#else
#define ASSERT( x )
#endif

void foo (int age)
{
 //개발시 디버깅을 편리하게 하기 위해 또는 함수 인자에 대해 ASSERT()를 수헁한따>
 ASSERT(age >0);

 printf("foo 실행 \n");
}

void main()
{
 foo(-10); // 잘못된 인자.. 실행시 문제점 발견.
    // 개발시 최대한 빨리 이곳이 잘못 되었다고 알아 내어야 한다.
}

*/
/*

#define DEBUG 주석 처리 하면.. ifdef 컴파일 안됨..

//A가 만든 코드 - 최대한 안전하게 만들자..
void foo(int age)
{
 int * n;

 // 개발 할때는 필요하지만 개발 끝나고 나면 필요 없음..
#ifdef DEBUG // 디버거가 있어야 컴파일 가능..
 //--수정된 코드--//
 if (age <= 0)
 {
  printf("foo : 잘못된 인자가 왔습니다. \n");
  return;
 }
 //---------------//
#endif

 n = (int *)malloc(sizeof(int) * age); // 나이만큼 메모리 할당
}
//B가 만든 코드
void main()
{
 //깜빡하고 음수를 보냄
 foo(-10);
 foo(10);
}

 

*/

/*
void main()
{
 printf("%s\n",__FILE__);
 printf("%s\n",__TIME__);
 printf("%d\n",__LINE__);
}
*/
//---------------------------------------------
/*


//c에서의 다양한 에러 처리 기법들
// extern "c" cpp => c 컴파일로 처리
// cafe.naver.com/cppmaster C/C++ 메뉴에 보시면 flexible array관한
//       설명이 있씁니다.. 시간 날때 읽어 보세요..


int foo()   //이 코드가 좋은 코드인지 나쁜 코드인지 판단해 보세요
{     
 FILE* f = 0;
 char* buf = 0;
 int n = 0;
 int ret = -1; //단일 함수 내에서 에러 처리를 위해 사용하는 goto는 실제 많이 사용하는 기법.


 f = fopen(...);
 if( f == 0 ) goto ERR:

 buf = (char*)malloc(sizeof(100));
 if(buf == 0) goto ERR:

 n = fread(...);
 if( n <= 0 ) goto ERR:

 // 성공 buf 사용.
 ret = 1;
   
ERR:
 //자원정리
 if( f ) fclose( f );
 if( buf ) free( buf );
 return ret;//성공.
 
}

*/

/*
int foo()   //이 코드가 좋은 코드인지 나쁜 코드인지 판단해 보세요
{     //one entry exit - if 가 성공인가를 조사.
 FILE* f = 0;
 char* buf = 0;
 int n = 0;
 int ret = -1; //실제로 초기화 
 f = fopen(...);
 if( f != 0 )
 {
  buf = (char*)malloc(sizeof(100));
  if(buf != 0)
  {
   n = fread(...);
   if( n > 0 ) //성공
   {
    // 성공 buf 사용.
    ret = 0;
   }
   free(buf);
  }
  fclose(f);
 }
 return ret;//성공.
}
*/

/*
int foo()   //이 코드가 좋은 코드인지 나쁜 코드인지 판단해 보세요
{     //one entry multiple - if 가 실패를 조사.
 FILE* f = 0;
 char* buf = 0;
 int n = 0;
 
 f = fopen(...);
 if( f==0 )//실패
  return -1;
 buf = (char*)malloc(sizeof(100));
 if(buf == 0)//실패
 {
  fclose( f );
  return -1;
 }
 n = fread(...);
 if( n<=0 ) //실패
 {
  fclose(f);
  free(buf);
  return -1;
 }
 //성공, buf 사용

 //자원 정리
 fclose(f);
 free(buf);
 return -1; //성공.
}
*/

 

/*
// 대다수 c함수는 실패시 실패의 이유를 전역변수인 erron에 넣어 준다. !!
// errno(), strerror(),perror()

#include <stdio.h>
#include <stdlib.h>
#include <errno.h> // erron 을 사용 하기위해
#include <string.h>

void main()
{
 FILE* f = fopen("a.txt","rt");
 if(f == 0)
 {
  perror("Fail"); //""임의 문자를 출력하고 ":" 출력후 strerror(errno) 출력
  printf("%d\n",errno);
  printf("%s\n",strerror( errno ) );
  printf("Fail \n");
 }
}
*/

반응형

'프로그래밍' 카테고리의 다른 글

함수 및 포인터  (0) 2009.07.19
Flexible Array  (0) 2009.07.19
Dos Compilering & Make Asm  (0) 2009.07.19
Buffer OverFlow  (0) 2009.07.19
Asm Ex File  (0) 2009.07.19

댓글