[42Seoul] 씨쁠쁠05

오젼·2022년 6월 14일
0

[42Seoul]

목록 보기
15/24

ex00

try & catch

  • 예외가 생긴 경우 throw를 쓰고 전달하고 싶은 객체를 써준다.
  • 아무 객체나 던져도 상관 없지만 표준 라이브러리에 여러 예외가 미리 정의되어 있음. 이를 사용하면 좋음.
  • throw 한 위치에서 즉시 함수가 종료되고 예외처리 부분으로 점프. (가장 가까운 catch문으로 점프)
  • stack에 생성했던 객체들을 모두 소멸시켜줌!(소멸자로)

생성자에서 예외처리

  • !! 생성자에서 예외를 던질 때는 소멸자가 호출되지 않기 때문에 catch에서 잘 해제시켜줘야 한다.

예외처리 순서

  • catch문의 경우 가장 먼저 대입될 수 있는 객체를 받는다.
  • 기반 클래스 객체, 파생 클래스 객체 순으로 catch문을 작성하게 되면 기반 클래스 포인터에 연결된 파생 클래스 포인터의 경우 기반 클래스 catch문으로 들어가 버리게 된다.
  • 때문에 catch문은 파생 클래스, 기반 클래스 순으로 catch할 수 있도록 작성하는 것이 좋다.

모든 예외 객체 catch

  • catch(...) 를 쓰면 try 안에서 발생한 모든 예외들을 받을 수 있다.

ex01

  • try & catch 두 번째 연습

ex02

  • Form class를 abstract class로 만들고 이를 바탕으로 concreate class를 만든다.
  • execute 관련한 exception 하나 더 만들어야 함

ShrubberyCreationForm

  • 관목 생성 폼
  • target + shrubbery 파일을 생성하고 그 안에 ascii tree를 넣으면 됨

RobotomyRequestForm

PresidentialPardonForm

  • Zaphod Beeblebrox에 의해 사면되는 form

ex03

  • Intern class를 만들어야 함
  • form list를 배열로 만들어 매핑해서 사용
  • formName과 formType을 원소로 갖는 formList struct 선언하고 formList 배열 선언 후 makeForm에서 사용

Form *makeForm(const std::string &formName, const std::string &target) const;

  • formList를 form 종류에 맞게 초기화
{"presidential pardon", new PresidentialPardonForm(target)},
{"robotomy request", new RobotomyRequestForm(target)},
{"shrubbery creation", new ShrubberyCreationForm(target)},
{"", NULL}}
  • formList에서 만드려는 form이 있는지 찾은 후 있다면 해당 formType을 리턴

0개의 댓글