'catch'에 해당되는 글 2건

  1. 2012.10.24 하나의 try 블록과 다수의 catch 블록
  2. 2012.10.17 예외처리(Exception Handling)

자료형이 일치하지 않아도 예외 데이터는 전달된다.


int Simple(void)

{

...

try

{

if(...)

throw -1;    // int형 예외 데이터

}


catch(char expn)    {...}    // char 형 예외 데이터를 전달하라.

}


이 경우, 자료형의 불일치로 인해서 예회는 처리되지 않는다.(catch 블록으로 값이 전달되지 않는다.) 따라서 Simple 함수를 호출한 영역으로 예외 데이터가 전달된다.







하나의 try 블록과 다수의 catch 블록


- 하나의 try 블록 내에서 유형이 다른 둘 이상의 예외상황이 발생할 수도 있고, 이러한 경우 각각의 예외를 표현하기 위해 사용되는 예외 데이터의 자료형이 다를 수 있기 때문에, try 블록에 이어서 등장하는 catch 블록은 둘 이상이 될 수 있다.








전달되는 예외의 명시


- 함수 내에서 발생할 수 있는 예외의 종류도 함수의 특징으로 간주된다. 따라서 이미 정의된 특정 함수의 호출을 위해서는 함수의 이름, 매개변수 선언, 반환형 정보에 더해서, 함수 내에서 전달될 수 있는 예외의 종류(예외 데이터의 자료형)과 그 상황도 알아야 한다. 

그래야 해당 함수의 호출문장을 감싸는 적절한 try~catch 블록을 구성할 수 있다.



"즉, 함수를 정의할 때에는 함수 내에서 발생 가능한 예외의 종류를 명시해 주는 것이 좋다."



throw(int, char) 선언은 함수 내에서 예외상황의 발생으로 인해, int형 예외 데이터와 char형 예외 데이터가 전달될 수 있음을 알리는 것이다.

물론 위와 같이 함수가 선언되면, 함수로부터 int형 예외 데이터와 char형 예외 데이터만이 전달되어야 하며, 다른 자료형의 예외 데이터가 전달될 경우 terminate 함수의 호출로 인해서 프로그램은 종료되고 만다.






전달되는 예외의 자료형을 명시하는 부분이 비어있다. 

즉, 이는 어떠한 예외도 전달하지 않음을 의미한다. 따라서 위의 함수가 예외를 전달할 경우 프로그램은 그냥 종료가 된다.



※ unexpected 함수

- 함수의 선언에 명시되지 않은 예외가 전달될 경우 unexpected라는 이름의 함수가 호출이 되며, 이 함수의 기본 기능은 '프로그램의 종료(terminate 함수의 호출)'이다. 때문에 명시되지 않은 예외가 전달될 경우 프로그램이 종료되는 것이다.

Posted by scii
:

C++에서 말하는 '예외(Exception)' 는 프로그램의 실행 도중에 발생하는 문제상황을 의미한다.

따라서 컴파일 시 발생하는 문법적인 에러는 예외의 범주에 포함되지 않는다.


ex) 나이를 입력하는데 0보다 작은 값이 입력되었다.

       나눗셈을 위한 두 개의 정수를 입력 받는데, 제수로 0이 입력되었다.

       주민등록번호 13자리만 입력하라고 했더니, 중간에 -를 포함하여 14자리를 입력하였다.


이렇듯 '예외' 라는 것은 문법적인 오류가 아닌, 프로그램의 논리에 맞지 않는 상황을 의미한다.



0으로 나누는 연산은 불가능하므로, 프로그램이 강제로 종료되어버린다.


예외가 발생하면, 그에 따른 처리가 이뤄져야지, 위의 실행결과에서 보이듯이 그냥 프로그램이 종료되어버리는 상황을 만들어서는 안 된다.






if 문을 이용한 예외의 처리




if문을 이용한 예외처리는 "에외처리를 위한 코드와 프로그램의 흐름을 구성하는 코드를 쉽게 구분하지 못하게 한다."


※ if문이 등장하면 에외처리를 위한 코드라고 생각하고, 주석을 달 수 있다.

하지만! 프로그램의 논리적인 기능의 완성을 위해서도 if문은 사용된다. 그리고 예외가 아닌 다른 정보의 기록을 위해서도 주석은 사용된다.

즉, if문과 주석만을 사용해서는 딱 보고 예외처리라고 판단할 수 없다.






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


- C++ 은 구조적으로 예외를 처리할 수 있는 메커니즘을 제공한다. 이 메커니즘을 이용하면, 코드의 가독성과 유지보수성을 높일 수 있다. 

예외의 처리를 프로그램의 일반적인 흐름에서 독립시키는 것이 가능하기 때문이다.


try          예외를 발견

catch         예외를 잡는다.

throw        예외를 던진다.




try 블록

- try 블록은 예외발생에 대한 검사의 범위를 지정할 때 사용된다. 즉, try 블록 내에서 예외가 발생하면, 이는 C++의 예외처리 메커니즘에 의해서 처리가 된다.


try

{

// 예외발생 예상지역 

}


catch 블록

- catch 블록은 try 블록에서 발생한 예외를 처리하는 코드가 담기는 영역으로써, 그 형태가 마치 반환형 없는 함수와 유사하다.


catch(처리할 예외의 종류 명시)

{

// 예외처리 코드의 삽입

}


throw

- 키워드 throw는 예외가 발생했음을 알리는 문장의 구성에 사용된다.

- ex) throw expn;

expn은 변수, 상수 그리고 객체 등 표현 가능한 모든 데이터가 될 수 있으나, 예외상황에 대한 정보를 담은, 의미 있는 데이터이어야 한다. 그래서 위 문장에서 expn의 위치에 오는 데이터를 가리켜 그냥 '예외'라고 표현하기도 한다.


※ try와 catch는 하나의 문장이다. 따라서 항상 이어서 등장해야 한다.

따라서, try 블록 내에서 발생하는 예외는 이어서 등장하는 catch 블록에 의해 처리된다.


=> throw에 의해 던져진 '예외 데이터'는, '예외 데이터'를 감싸는 try 블록에 의해서 감지가 되어 이어서 등장하는 catch 블록에 의해 처리된다.



즉, 예외가 발생하면(throw 절이 실행되면), 프로그램의 흐름이 중지되고, catch 블록에 의해서 예외의 처리과정을 거치게 되는데 이것이 바로 C++ 의 예외처리 메커니즘이다.




try 블록 내에서 예외가 발생하면, catch 블록이 실행되고 나서, 예외가 발생한 지점 이후를 실행하는 것이 아니라, catch 블록의 이후가 실행됨을 보인다.

이렇듯, 예외가 발생하면, 예외가 발생한 지점 이후의 나머지 try 영역은 그냥 건너뛰게 된다.


그리고 throw절에 의해 던져진 예외 데이터의 자료형과 catch 블록의 매개변수 자료형은 일치해야 한다. 만약 일치하지 않으면, 던져진 예외 데이터는 catch 블록으로 전달되지 않는다.






try 블록을 묶는 기준


- try 블록을 만나면 그 안에 삽입된 문장이 순서대로 실행된다.

- try 블록 내에서 예외가 발생하지 않으면 catch 블록 이후를 실행한다.

- try 블록 내에서 예외가 발생하면, 예외가 발생한 지점 이후의 나머지 try 영역은 건너뛴다.


묶는 기준 : 예외가 발생할만한 영역만 묶는 게 아니라, 그와 관련된 모든 문장을 함께 묶어서 이를 하나의 '일(work)' 의 단위로 구성하는 것이다.


"try 블록 내에서 예외가 발생하면, 예외가 발생한 지점 이후의 나머지 try영역은 건너뛴다."

Posted by scii
: