1. 참고도서 [Bottom] [Top]

2. 주요 문법 [Bottom] [Top]

try 블록은 예외가 발생할 코드 블록으로 그 뒤에 예외 처리를 위한 하나 이상의 catch 블록이 있어야 한다.

throw 문으로 예외를 전달한다.

함수 원형과 함수 선언시 throw() 문을 지정하면 전달될 예외를 지정할 수 있다. 예외를 지정하지 않고 throw() 문만 사용할 경우 예외를 전달하지 않는다.

2.1. 그 밖에 옵션들 [Bottom] [Top]

모든 예외를 처리할려면 생략 부호 ( ... ) 를 사용한다.

상위 try ~ catch 블록으로 예외를 전달해야할 경우 throw 문만 사용한다.

2.2. 객체로 예외처리하기 [Bottom] [Top]

예외 정보를 객체로 전달할 경우 참조에 의하여 전달하는 것이 좋다. C++ 의 throw-catch 메커니즘이 함수의 인수 전달 방식과 비슷하기 때문에 참조에 의한 전달 방식이 가능하다.

3. exception 클래스 [Bottom] [Top]

C++ 에서는 언어 차원에서 예외 처리를 포함 시키고 있다. 그 예로 exception 클래스는 다른 예외의 Base 클래스로 정의되어 있다. 또한 프로그램 코드에서는 exception 객체를 전달하거나 다른 exception 클래스의 Base 클래스로 사용할 수 있다.

3.1. what() 가상 함수 [Bottom] [Top]

예외에 대하여 문자열을 반환하는 함수로 시스템에 따라 다른 문자열을 반환한다.

3.2. bad_alloc 예외 [Bottom] [Top]

exception 클래스를 상속한 클래스로 new 연산자를 사용하여 메모리 할당시 문제가 발생하면 전달되는 예외가 bad_alloc 예외 이다.

4. Unexpected exception [Bottom] [Top]

4.1. 처리 안된 예외 [Bottom] [Top]

지정된 예외 처리가 없을 경우 uncaught exception 에러 메세지가 표시되고 기본적으로 프로그램이 종료된다. 예외가 처리되지 않은 경우 다음과 같은 과정으로 프로그램이 종료된다.

  1. unexpected exception 에러 발생
  2. terminate() 함수 호출
  3. terminate() 함수에서 abort() 함수를 호출
  4. 프로그램 종료

4.1.1. 예외 처리 함수 변경 [Bottom] [Top]

set_terminate() 함수로 terminate() 함수를 설정할 수 있다.

4.2. 예상하지 못한 예외 [Bottom] [Top]

예상하지 못한 예외란 예외 처리가 없는 함수에서 예외가 발생하는 것과 같은 경우에 해당되며 처리 안된 예외와 비슷하게 처리된다.

  1. unexpected() 함수 호출
  2. terminate() 함수 호출
  3. terminate() 함수에서 abort() 함수를 호출
  4. 프로그램 종료

4.2.1. 예외 처리 함수 변경 [Bottom] [Top]

set_unexpected() 함수로 unexpected() 함수를 설정할 수 있다.

4.2.2. unexpected_handler() 함수의 선택 [Bottom] [Top]

set_unexpected() 함수로 지정하는 함수의 동작은 set_terminate() 함수의 경우보다 더 정형화되어 있다. 특히 unexpected_handler() 함수는 다음과 같은 선택을 가지고 있다.

5. 예외를 사용할 때 주의할 사항 [Bottom] [Top]

5.1. 예: 동적 메모리 할당 [Bottom] [Top]

예외 처리시 객체의 경우 함수가 종료할 때 자동으로 객체가 제거 된다. 하지만 포인터 변수를 이용하여 할당된 경우 메모리 누수가 발생할 수 있다.

예1> 자동 객체 제거

예2> 메모리 누수

이런 경우 프로그래밍에 많은 주의를 기울려야 한다. 하지만 auto_ptr 템플릿을 이용하여 이러한 문제를 해결할 수 있다.

6. exception 헤더 파일 [Bottom] [Top]


CategoryCpp

C++ Exception (last modified 2009-06-18 04:47:46)