C++의 예외

개요


말 많은 c++에서의 예외.

알아보겠다.




예외


프로그램을 실행하다 보면 정상적으로 실행을 할 수 없는 상황이 온다. 이를 방지하기 위해 예외를 사용한다.

c언어에서는 예외가 없다. 그렇기 때문에 예외 상황을 일일이 처리해줘야하는데 abort() 호출 방법과 에러코드 리턴을 통해서 할 수 있다.

그러나 c++에는 예외라는 기능이 추가되었다. 그러나 예외는 점점 축소되는 추세라고 한다.

이유는 사람이 모든 예외사항을 컨트롤 할 수 없다는 것이다. 예외를 사용하는 프로그램에 100줄짜리 함수가 있다하면 100개의 Exit이 있는 것이다.

컴파일러가 어셈블리어로 바꿨을 때 코드의 수부터가 차이가 난다.

생성자에서는 논리적, 구조적으로 예외를 사용할 수 밖에 없다. 메모리를 할당 했는데 메모리 부족으로 못했다면? 내가 어떻게 체크하는가

그러나 나머지 부분에서는 충분히 조건문을 통해서 예외처리가 가능하다.

예외처리는 세 단계를 통해서 이루어진다.

  1. try 블럭을 실행한다.
  2. 예외를 발생시킨다.
  3. 예외 핸들러를 사용하여 예외를 포착한다.

예외에서 중요한 키워드는 throw, catch, try가 있다.

throw는 예외를 발생시킨다.

catch는 예외를 포착한다.

try는 특별한 예외들이 발생할 수 있는 하나의 코드 블록이다. 그 뒤에는 최소한 하나의 catch문이 온다.

try 블록 안에서 예외를 발생시킨다면 뒤에 오는 catch가 처리하는 구조이다.

예외발생은 함수 실행을 종료시킨다는 점은 리턴과 비슷하지만 호출한 프로그램에 제어를 넘기지 않고 try에 있는 함수를 발견할 때까지 현재 호출한 함수들을 거슬러 올라간다.

예외 클래스들의 송속 계층을 사용할 경우, 가장 늦게 만들어진 클래스의 예외가 가장 먼저 포착된다.




exception 클래스


c++ 언어에서 예외 클래스를 만들고 싶다면 부모 클래스로 사용하는 exception 클래스를 정의한다.

사용자가 상속받아 사용하면 exception 객체를 만든다.

그러면 what()이라는 가상함수가 주어진다. 이 함수는 예외 종류에 맞는 에러 원인 메세지를 리턴한다.



stdexcept 클래스


stdexcept는 logic_error와 runtime_error클래스를 정의한다. 이것들은 exception에서 상속받는다.



logic_error


  • domain_error : sin함수에 매개변수를 전달할 때 정의역이 -1 ~ 1이 아니라면 나는 에러
  • invalid_argument : 기대하지 않는 값이 함수에 전달되었을 때
  • length_error : 원하는만큼의 공간을 사용할 수 없을 때 대표적으로 string.append()의 에러
  • out_of_bounds : 인덱싱 에러



runtime_error


  • range_error : 언더플로나 오버플로 없이 계산 결과가 함수의 적절한 치역을 벗어날 때
  • overflow_error : 허용된 범위보다 더 많은 값을 건드릴 때
  • underflow_error : 부동소수점 계산에서 허용된 범위보다 적은 값을 건드릴 때




예외 주의사항


예외를 사용하면 프로그램의 크기가 매우 커지고 실행 속도가 떨어진다.

java에서는 다르게 c++을 아직까지 사용하는 업계는 속도, 성능을 중요시하는 분야이다.

따라서 c++을 공부할 때는 예외가 있다는 것을 알아두되 왠만한 것은 조건문과 에러코드를 통해서 처리하고 생성자등 불가피할 때만 사용하는 것이 적절하다.




nested class


클래스 안에 다른 클래스를 선언하면 내포클래스라고 한다.

클래스 선언을 내포하고 있는 클래스는 내포 클래스의 객체를 생성하여 사용할 수 있다.

내포클래스가 선언된 장소가 내포 클래스의 사용범위를 제한한다.

클래스 외부에서 사용하려면 감싸고 있는 클래스 지정자를 사용해야한다.

1
2
3
4
5
6
7
8
9
10
class a
{
  class b
  {
  ...
  };
  ...
};

a::b boy;