본문 바로가기
코스웨어/10년 시스템제어

일일 보고서 (8번 남민호)

by 알 수 없는 사용자 2010. 5. 20.
728x90
반응형
1. throw 와  try, catch()

- throw : 프로그램이 정상적으로 실행될 수 없는 상황일 때 이 명령으로 예외를 던진다. throw 다음에 던지고자 하는 예외를 적는다. 예외를 던
             진다 는 것은 예외가 발생되었다는 것을 알리며 이 예외를 처리하는 catch문으로 점프하도록 한다. throw 명령 아래쪽의 코드들은
             모두 무시되며 곧바로 예외 처리 구문으로 이동한다.  
- try     : 예외가 발생할만한 코드 블록을 지정하는데 try 다음의 { } 괄호안에 예외 처리 대상 코드를 작성한다. 이 블록 안에서 예외가 발생 때
             throw 명령으로 예외를 던진다. 
- catch : try 블록 다음에 이어지며 던져진 예외를 받아서 처리한다. 그래서 catch 블록을 예외 핸들러라고 부른다. catch 다음에는 받고자
             하는 예외의 타입을 적는데 이 객체는 throw에 의해 던져진다. catch 블록에는 예외를 처리하는 코드가 작성된다. 

2. 예제 소스 

    if(0>index)
    {
      throw "배열 범위를 초과하였음";
    }
    if(size<=index)
    {
      throw "배열 범위를 초과하였음";
    }
일단 throw는 출력할 메시지 를 말한다.  통해서  오류부분을 메시지 출력으로 바꾸고
try부분 은 실행되는 부분이다.  arr.SetAt(20,100)처럼  예외가 발생되는부분에 살짝 걸쳐두면된다. 
마지막으로  catch()부분인데 이경우는 도스창에서 명령어를 띄우는것이다.

try
{
  arr.SetAt(20,100);
  arr.SetAt(200,100);
  arr.SetAt(2000,100);
}
catch(const char *T)
{
  cout<<"예외 발생 : " << T << endl;
}

일반적으로 catch는 메시지를 받는부분이고  그 메시지는 catch의 인자로
문자열이기때문에 const char *를 사용하였다. 

예외라는것은 아트메가에서 인터럽터와 비슷하게 생각하면된다.(문자열로 보내는 경우)

class MyException
{
public:
  const void *sender;
  const char *description;
  int info;
  MyException(const void *sender,const char *description,int info)
  {    
    this->sender=sender;
    this->description=description;
    this->info=info;
  }
};
- 따로 클래스를 만들어서 예외를 처리할수 있다.

throw MyException(this,"배열 범위를 초과하였음",index);
- throw에서 객체를 넘겨줄수도 있다. 생성자에 맞게 인수를 전달

catch(MyException T)
{
  cout<<"객체주소:"<<T.sender<<endl;
  cout<<"예외 내용:"<<T.description<<endl;
  cout<<"부가정보:"<<T.info<<endl;
}
- catch부문에서는 인수를 객체를 만들어 선언하면 아무 문제 없다.



3. throw 와 catch의 관계

#include <iostream>

using namespace std;

void A();
void B();
void C();

int main()
{
  try
  {
    A();
  }
  catch(int T)
  {
    cout << "main::catch " << T << endl;
  }
  return 0;
}

void A()
{
  try
  {
    B();
  }
  catch (int ex)
  {
    cout <<"A::catch " << ex << endl;
    throw;
  }
}
void B()
{
  cout <<"B() 시작\n";
  try
  {
    C();
  }
  catch(int ex)
  {
    cout <<"B::catch" << ex << endl;
    throw;
  }
  cout <<"B() 끝\n";
}
void C()
{
  cout <<"C() 시작\n";
  throw 100;
  cout <<"C() 끝\n";
}
- 각 함수는 다음 함수를 호출을 하고 마지막함수에 throw을 넣었다. 그러면 결과를 예측 해보자.
  C함수에서 throw 던지면 B에서 catch 해서 출력후 다시 throw 던지면 A에서 catch 한다. A에서
  받으면 다시 main의 catch 로 가서 출력한다.

 기본적으로 이전 함수catch로 단계별로돌아가는걸 볼수 있다.

※ 타입이 없는 경우
catch(outofRangeException &T)
{
  cout << "객체 주소 : " << T.sender << endl;
  cout << "예외 내용 : " << T.description << endl;
  cout << "부가 정보 : " << T.info << endl;
}
catch(memoryException &T)
{
  cout << "객체 주소 : " << T.sender << endl;
  cout << "예외 내용 : " << T.description << endl;
  cout << "부가 정보 : " << T.info << endl;
}
catch(...)
{
  cout << "이건 무슨....?\n";
}
- throw에서 던질경우 catch가 받을수 있다. 그런데 throw을 던질때 타입이 객체이면
  그 객체 맞게 catch간다. 하지만 throw 던질 타입이 없다면 저렇게 catch(...)으로
  표현할수있다. 출력하면 당연히 마지막 catch(...) 실행 된다.


많이 부족하지만 잘봐주세요..ㅋㅋ
728x90