BLOG main image
전체 (276)
[Computer] (42)
[Programming] (62)
[DBMS] (26)
[Operating System] (21)
[Study English] (8)
[For money] (28)
[Interest] (89)
«   2009/11   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          
77917 Visitors up to today!
Today 14 hit, Yesterday 95 hit
'예외처리'에 해당되는 글 2건
[폭주기관차, 2007/12/20 22:52, [Programming]/Visual C++ API/MFC]
예외처리는 Java에서 처음 개념을 봤다.

VB에서의 ON ERROR GOTO ~ 처럼 에러가 나면 자동으로
그 분기로 점프하는건줄 알았는데 그거랑은 약간
달른 것이었다.

하지만 조금만 생각해보니 ON ERROR GOTO도 구현할 수 있을꺼
같았고 오히려 ON ERROR GOTO보다 더 유용할 뜻 보인다.
(이전까지는 예외 처리가(try ~ catch가) 왜 있는지 몰랐다.)

우선 내가 그동안은 try ~ catch를 등한시 여기다가 갑자기 관심을 갖게 된 것은
필요한 곳을 찾았기 때문이다.

그동안 코딩을 하면서 메모리 누수가 발생해도 어쩌다가 발생한거니
그리 크게 생각 안하고 대충 프로그램 다시 실행하여서 오류 안나는 동작만
하곤 했다.
하지만 try ~ catch를 다시 곰곰히 보니 어떻게 써야 할지 알았다.

char *pMem = (char *)malloc( 40 * sizeof( char ) );

if( pMem == NULL )
    return FALSE;
   
while( 1 )
{
  이런 저런 수행 문;
   
  if( 에러 발생? )
  {
    if( pMem != NULL )
    {
      free( pMem );
      pMem = NULL;
      return FALSE;
    }
  }
}

if( pMem != NULL )
{
  free( pMem );
  pMem = NULL;
  return TRUE;
}

여기서 처럼 난 항상 if문으로 에러 났을 경우 상황을 대처하곤 했다.
그래도 별 문제는 없었다.

하지만 오늘 발생하고야 말았다. 그것은 if문으로 에러 처리를 할 경우
코드가 너무 방대해지고, 같은 코드를 계속 넣어야 한다는 것이다.

    if( pMem != NULL )
    {
      free( pMem );
      pMem = NULL;
      return FALSE;
    }


프로그램 수행중 에러가 나고 함수에서 빠져 나갈때 잡았던 메모리를 풀어줘야 한다.
그런데 이 구문을 수행하지 않고 리턴을 하게 된다면, 처음에야 오류가 나지 않지만
나중에 가서 알 수 없게 오류가 발생하게 된다.

물론 코딩할때 신중하게 저 코드를 다 써준다면 괜찮지만, 문제는 귀차니즘과 유지보수에
있다.
저런 코드를 매번 삽입하는 번거로움은 둘째 치고, 만약 메모리 변수를 하나 더 선언하게
된다면?

char *pTmp = (char *)malloc( 10 * sizeof( char ) );


이 변수를 추가 한다면 return FALSE, return TRUE; 구문 전에 free(pTmp) 라는 구문을
더 추가 해줘야한다. 한 줄 뿐이겠지만, 나중에 코드가 복잡해진다면 일일이 찾아
넣기란 매우 번거롭고 헷갈릴 것이다.

이를 try ~ catch문으로 쉽게 해결 할 수 있게 되었다.


< try ~ catch문의 간단한 이론 부분 보기 > - 클릭



중요한것은 try, catch, throw, finally 43가지가 있다.

우선 위의 예제부터 try ~ catch로 바꾸어 보자

char *pMem = (char *)malloc( 40 * sizeof( char ) );
BOOL  bResult = TRUE;

try
{
  if( pMem == NULL )
      throw "메모리할당 에러";
     
  while( 1 )
  {
    이런 저런 수행 문;
     
    if( 에러 발생? )
    {
      throw "기타 에러 발생";
    }
  }
}
catch( char *pE )
{
  printf( "에러 발생\r\n   %s", pE );
 
  bResult = FALSE;
}
 
finally
{

  if( pMem != NULL )
  {
    free( pMem );
    pMem = NULL;
  }
 
}

return bResult;

이렇게 변할 것이다.
길이 상으론 오히려 더 복잡해 보인다.
하지만 프로젝트가 커질 수록 오히려 이런 방식이 유지보수하고, 오류 처리에 더 간단할 것이다.

그리고 try ~ catch에 관한 또 다른 예제문도 밑에 있다.
그냥 지나치기엔 안깝고도 자세한 설명이기에 그대로 긁어옴
(출처는 맨 밑에 표기 해뒀습니다)

<좀더 자세한 예제 보기>



출처 : kv20님의 글
(수정일 : 2007년 12월 27일)
Trackback Address :: http://kongmks.cafe24.com/trackback/271
Name
Password
Homepage
Secret
[폭주기관차, 2007/08/22 09:50, [Programming]/Visual C++ API/MFC]
CInternetSession  m_Session;
CFtpConnection   *m_pConnection = NULL;

try
{
    //Anonymous로 로그인
    m_pConnection = m_Session.GetFtpConnection("ftp.test.co.kr");

    // 사용자명과 패스워드 로그인
    /* m_pConnnection = m_Session.GetFtpConnection("ftp.test.co.kr","User_Name","Password"); */
}
catch (CInternetException *m_pEx)
{
    // 에러메세지 출력
    m_pEx->ReportError(MB_ICONEXCLAMATION);

    m_pConnection = NULL;

    m_pEx->Delete();
}

delete m_pConnection;

출처 : mtcook님의 블로그

Trackback Address :: http://kongmks.cafe24.com/trackback/245
Name
Password
Homepage
Secret
*1