Programming Language/C,C++

C++] 예외 및 예외 처리 기본

TwinParadox 2017. 11. 26. 21:02
728x90

프로그램이 실행 중 오동작이나, 결과를 달리 하게 만드는 예상하지 못한 상황 발생을 예외(Exception)라고 하며, 이를 적절히 처리해주는 것을 예외 처리(Exception Handling)라고 한다. 대부분의 학교에서 처음 프로그래밍에 입문해서 코드를 짜기 시작하면, 기능적인 부분에 집중을 하고 책을 따라가기 때문에 이 예외에 대해서 고려할 일이 거의 없어서 이쪽 분야에 관심을 두지 않는 학생들을 졸업장을 받을 때까지 신경 쓰지 않는 경우도 간혹 있다.


만약 자신이 소프트웨어 분야에 관심이 많고, 그로 인해서 자신의 경험을 쌓고자 개인적인 프로젝트를 진행하거나, 학년이 올라 텀 프로젝트를 실시해서 그럴싸한 프로그램을 완성해야 하는 상황이 오게 되면, 예상하지 못한 곳에서 발생하는 문제들을 접하고 해결하면서, 자연스럽게 이 예외와 예외 처리에 대해서 고민하지 않을 수가 없게 된다.


OS(Operating System;운영 체제)는 하드웨어나 시스템 자원을 다루는 상황에서 발생하는 예외를 응용프로그램에게 알려주는 예외 처리 기능을 따로 두고 있어 이 부분에 대해서는 크게 신경 쓰지 않아도 된다. 하지만 C++로 직접 만든 응용 프로그램에서의 오동작을 막기 위해서는 개발자가 별도의 예외 처리를 실시해야 하는데 이는 비단 C++에서만 국한된 이야기가 아니라 C#, Java 등 다른 언어에서도 마찬가지다. 다만, C++은 다른 언어들에 비해서, 예외에 대해서 더 많이 신경 쓰고, 알맞은 처리 방식으로 예외 처리를 실시해야 한다는 점에서 신경 써줘야 할 부분이 많다. 반면, Java 같은 경우에는 예외 처리에 대해서 최대한 적극적인 태도로 임하게끔 컴파일 오류를 발생시키거나 하는 방법으로 개발자의 예외 탐색 및 예외 처리를 돕는다.



예시 코드

try
{
   if(n==0)
     throw n;
   else
   {
      su=k/n;
      ~~~
   }
   ~~~
}
catch(int e)
{
   cout<<“Exception”;
   cout<<e<<“로 나눌 수 없음.\n”;
   su=0;
}
cout<<“Result : “<<su;







C++에서는 try-throw-catch 방식의 예외 처리 방식을 사용한다.


try 블록

try 블록에서는 예외가 발생할 소지가 있는 문장들을 묶고, 이를 catch 블록에 연결해 선언한다. 하나의 try 블록에 대해서 catch 블록은 여럿일 수 있으며, try 블록 내에서는 예외 발생을 탐지하는 코드를 작성해, 예외가 탐지되면 throw 구문을 이용해서 예외 발생을 알린다.



throw 문

말 그대로 예외를 '던진다'. try 블록에서 실행한 코드에 예외가 발생하면 예외 값을 던지며, 던져진 예외 값은 연결된 catch 블록에서 처리한다. throw 문이 실행되면 곧장 catch 블록으로 점프하기 때문에, 이후의 try 블록 코드는 실행되지 않는다. try 블록 내에서 여러 throw 문을 작성할 수 있는데, throw 문이 예외를 던지면, 던져진 예외 값과 일치하는 catch 블록이 실행된다.



catch 블록

예외를 처리하는 것은 catch 블록에서 이루어지는데, catch 블록에서는 던져진 예외 값을 선택할 수 있다. 이 때 예외 값을 받는 것은 예외 파라미터(Exception Parameter)이며, 예외 파라미터는 함수 파라미터와 같이 예외의 타입과 매개 변수로 선언하며, 하나만 선언할 수 있다. throw 문이 던진 예외 값의 타입이 파라미터의 타입과 일치할 때 매개 변수에 예외 값이 전달되며, catch 블록이 실행된다. 만일 throw 문이 실행되었을 때 예외 값을 받아줄 catch 블록이 마땅히 없으면, 프로그램은 바로 종료된다.




throw 문으로 던지는 예외는 catch 블록에서 처리 되기 때문에, 기본적으로 이 둘을 잘 작성해주어야 한다. throw가 던지는 타입이 어느 특정 하나로 국한되지 않으며, 정수부터 시작해서 객체까지 다양한 타입의 예외 값을 던질 수 있다는 사실을 알아두자.



예외 처리 과정

예외가 처리되는 구체적인 과정을 아래 그림을 통해 보자. 아래 코드는 두 정수를 받아 나눗셈을 실시하는 코드로 이 코드에서 발생할 수 있는 가장 대표적인 예외는 바로 '0으로 나누는 예외'일 것이다. 이 예외가 발생했을 때 어떻게 동작하는지 알아보자.






728x90
728x90