728x90
컴퓨터 시스템이 동작하는 도중에 예상하지 못한 오류가 발생하여, 실행되고 있던 프로그램이 중지되는 것을 예외(exception)이라고 한다. 코딩을하면서 이러한 예외 상황을 처리할 수 있도록 하는 것을 예외 처리(exception handling)이라고 하는데, C++은 언어 차원에서 예외 처리 문법을 제공하여, 예외 처리하는 방식을 확장하고 관리하기 쉽도록 해준다.
try, throw, catch
- try : 예외가 발생할 가능성이 있는 코드 블록
- throw : try 문에서 발생한 오류에 대한 정보를 전달
- catch : 발생한 예외에 대해 예외 핸들러가 처리할 내용을 담은 코드 블록
C++에서 예외 처리는 다음과 같은 순서로 진행된다.
- try문에 도달한 프로그램의 제어는 try문 내의 코드를 실행한다.
- 이때 예외가 발생(throw)하지 않으면 프로그램의 제어는 맨 마지막 catch절 바로 다음으로 이동한다.
- 만약 예외가 발생하면 catch 핸들러는 다음과 같은 순서로 적절한 catch절을 찾게 된다.
- 스택에서 try문과 가장 가까운 catch절부터 차례대로 검사한다.
- 만약 적절한 catch절을 찾지 못하면, 바로 다음 바깥쪽 try문 다음에 위치한 catch절을 차례대로 검사한다.
- 이러한 과정을 가장 바깥쪽 try문까지 계속 검사하게 된다.
- 그래도 적절한 catch절을 찾지 못하면, 미리 정의된 terminate()함수가 호출 된다.
- 만약 적절한 catch절을 찾게 되면, throw문의 피연산자는 예외 객체의 형식 매개변수로 전달된다.
- 모든 예외 처리가 끝나면 프로그램의 제어는 맨 마지막 catch절 바로 다음으로 이동한다.
Exception 클래스
예외 클래스
C++은 여러 예외를 처리하기 위해 exception 헤더 파일을 통한 다양한 예외 클래스를 제공한다. 이러한 예외 클래스는 오류 코드값을 가지는 멤버 변수 및 오류 코드를 검사하거나 오류 메시지를 출력하는 멤버 함수 등 오류에 대한 모든 처리가 가능하도록 다양한 멤버를 포함하고 있다.
이와 같은 예외 클래스도 클래스이므로, 상속할 수 있으며 다형성도 성립한다. 또한, 생성자와 연산자에서도 예외 처리 기능을 사용할 수 있다.
exception 클래스
C++은 여러 예외 클래스의 기초 클래스로 사용할 수 있는 exception 클래스를 제공한다. exception클래스는 시스템에 따라 하나의 문자열 포인터를 반환하는 what()이라는 가상 멤버 함수를 제공한다.
이 멤버 함수는 가상 함수이므로, exception 클래스로부터 파생된 클래스 내에서 재정의할 수 있다. exception 클래스의 what() 멤버 함수는 별다른 일을 하지는 않지만, 파생 클래스에서 원하는 문자열을 출력할 수 있도록 재정의할 수 있다.
728x90
300x250