클래스의 객체도 예외 데이터가 될 수 있다. 그리고 이것이 일반적인 방법이다.



예외 클래스와 예외 객체


예외발생을 알리는데 사용되는 객체를 가리켜 '예외객체'라 하며, 예외객체의 생성을 위해 정의된 클래스'예외 클래스'라 한다.

그리고 객체를 이용해서 예외상황을 알리면, 예외가 발생한 원인에 대한 정보를 보다 자세히 담을 수 있다.



54행: 예외객체를 전달하는 일반적인 방법을 보이고 있다. 어차피 예외객체는 C++의 예외처리 메커니즘에 의해 처리되기 때문에 코드상에서 이를 직접 참조할 필요가 없다. 

따라서 예외객체는 임시객체의 형태로 생성하는 것이 보통이다.


예외 클래스라고 해서 특별히 다른 것은 없다. 다만, 해당 예외상황을 잘 표현할 수 있도록 정의하면 된다.

그리고 너무 복잡하게 정의하지 않는 것이 좋다. 예외의 표현을 위한 최소한의 기능만 담아서 정의하면 된다.







상속관계에 있는 예외 클래스


- 예외 클래스도 상속의 관계를 구성할 수 있다.




56행: 상속에 의해서 DepositException 객체도 AccountException 객체로 간주가 되기 때문에 이러한 선언이 가능하다.


위에서 보이듯이 상속을 통해서 예외 클래스를 묶으면, 예외의 처리를 단순화시킬 수 있다. 물론 이것이 항상 좋은 것은 아니지만, 단순화해도 되는 상황에서는 유용하게 활용될 수 있다.







예외의 전달방식에 따른 주의사항 


- 예외가 발생하면, 해당 예외 데이터를 전달받을 수 있는 catch 블록을 위에서 아래로 찾아내려 간다. 그리고 적절한 catch 블록을 찾게 되면, 해당 catch 블록이 실행되면서 예외의 처리는 완료가 된다.


# catch 블록이 잘못된 예


위 예제의 문제점은 모든 예외 객체가 AAA 클래스를 상속하기 때문에, 45행의 catch블록이 실행된다는데 있다. 

즉, 위와 같은 구조로 catch 블록을 구성하면, 50, 55행의 catch 블록은 실행되지 않는다. 

내가 원하던 것은 "BBB 예외객체는 catch(BBB& expn) 블록에 의해서 처리가 되고, CCC 예외객체는 catch(CCC& expn) 블록에 의해서 처리가 되게끔 하고 싶었던 것이다."



내가 원하던대로 하게 하려면, catch블록의 배치를 변경해야 한다.




BBB 객체는 일종의 AAA 객체이지만, AAA 객체는 일종의 BBB 객체가 아니다. CCC도 마찬가지.

그렇기 때문에 원하는 결과를 얻을 수 있다.



Posted by scii
: