'예외'에 해당되는 글 1건

  1. 2012.10.24 예외처리

예외처리

Developer/C / C++ 2012. 10. 24. 09:41

C++의 예외처리 방식

 => 예외를 정의 > 예외 발생 > 예외 포착 > 포착된 예외를 처리


C++의 예외 처리 매커니즘

try : 예외처리를 하는 코드블록을 선언(예외 발생에 대해 검사를 수행할 범위를 설정한다)

catch : 예외를 처리하는 코드 블록을 선언 

※ catch블록은 try블록 뒤에 바로 이어 등장해야한다.

throw : 예외사항이 발생하였음을 알린다.


1) try ~ catch

try {

if(예외 발생상황)

throw ex    //thorw에 의한 예외발생

} catch (처리되어야 할 예외의 종류) {

예외상황을 처리

}


2) throw

throw ex;    //ex의 예외를 발생시킴(ex는 변수, 상수 객체등 대부분의 데이터가 될수있다.


#include<iostream>

 

using namespace std;

 

int main(void) {

int a, b;

     

cout << "두개의숫자입력: ";

cin>>a>>b;

 

try {

if(b==0)

throw b;

 

cout << "a/b의몫: " << a/b << endl;

cout << "a/b의나머지: " << a%b << endl;

} catch (int exception) {

cout << exception << " 입력" << endl;

cout << "입력오류!" << endl;

}

return 0;

}

출력결과


스택풀기

발생한 예외에 대해서 처리할 catch블록이 없는경우, 자동으로 상위함수로 예외객체를 전달한다.

만약 main()함수까지 전달되었을 때에도 처리할 catch블록이 없으면 프로그램이 종료된다.


abort() : 에러메세지를 보여주고 프로그램을 종료

int main(void) {

abort();    //에러 메세지를 출력함.

return 0;

}


예외클래스

예외를 발생시키기 위해 클래스를 정의하고 객체를 생성하게 되는데 이러한 객체를 예외객체, 예외객체를 위해 정의되는 클래스를 예외 클래스라고 한다.

- 다른클래스의 맴버로 내포되는 예외클래스

class Vector{

  int size;

public:

  class ERange {......};    //out of Range Exception

  class ESize {......};   //bad Size Exception

  //......

};

void f()

{

  try { use_vector(); }

  catch (Vector::ERange) {......}

  catch (Vector::ESize) {......}

  //......

}


- 전역으로 예외 클래스 정의

class ERange {......};    //out of Range Exception

class ESize {......};   //bad Size Exception

 class Vector{

  int size;

public:

  //......

};

void f()

{

  try { use_vector(); }

  catch (ERange) {......}

  catch (ESize) {......}

}


#include<iostream>

using namespace std;


char* account="1234-5678";         //계좌번호

int sid=1122;                      //비밀번호

int balance=1000;                  //잔액

 

class AccountExpt {    //전역으로 예외 클래스 정의

         char acc[10];

         int sid;

public:

         AccountExpt(char *str, int id) {

                  strcpy(acc,str);

                  sid=id;

         }

 

         void What() {

                  cout << "계좌번호: " << acc << endl;

                  cout << "비밀번호: " << sid << endl;

         }

};

 

int main(void) {

         char acc[10];

         int id;

         int money;

 

         try {

                  cout << "계좌번호 입력: ";

                  cin>>acc;

                  cout << "비밀번호 4자리 입력: ";

                  cin>>id;

 

                  if(strcmp(account, acc) || sid!=id)    //계좌번호와 비밀번호가 맞지 않으면 AccountExpt발생

                           throw AccountExpt(acc, id);

 

                  cout << "출금액 입력: ";

                  cin >> money;

 

                  if(balance < money)

                           throw money;

                 

                  balance-=money;

                  cout <<"잔액: " << balance << endl;

        

         } catch (int money) {

                  cout << "부족 금액: " << money-balance << endl;

         } catch (AccountExpt& expt) {

                  cout << "다음입력을 다시 한번 확인하세요" << endl;

                  expt.What();

         }

         return 0;

}


예외처리 주의사항

1. 예외 명세를 사용하는 함수에서 예외가 발생하면, 그예외는 명세 목록에 있는 데이터 타입중 하나여야만 한다. 그렇지 않을경우 Unexpected Exception이 발생하게 되어 프로그램이 중단된다.

2. 발생된 예외에 대하여 catch블록에 포착되어 처리 되어야한다.

3. 예외를 많이 사용하면 프로그램의 크기가 커지고, 실행 속도가 떨어질수 있다.

4. 예외가 발생하는 경우, 사용 중이던 리소스에 대한 반환이 정확하게 이뤄지도록 catch블록을 신중하게 구성해야한다.


excpetion클래스

1. exception 헤더 파일에 선언되어있다.

2. 다른 예외 클래스들의 기본 클래스로 사용된다.

3. what이라는 가상함수가 주어져 exception클래스를 상속받는 예외클래스는 what()함수를 오버라이딩(재정의) 하여 반환할 문자열을 지정해줄수 있다.

Posted by No names
,