throw
문으로 예외를 던지고 try ~ catch
로 받기throw
다음 문장들은 실행되지 않음<exception>
라이브러리의 std::exception
클래스https://ansohxxn.github.io/cpp/chapter14-4/
class exception {
public:
exception () throw();
exception (const exception&) throw();
exception& operator= (const exception&) throw();
virtual ~exception() throw();
virtual const char* what() const throw();
}
<stdexcept>
에 이미 정의된 에러를 사용할 수도 있음: public std::exception
으로 상속받고 what()
오버라이딩const char *
를 리턴하기 때문에 std::string
을 리턴하면 안 됨! (보통 리터럴 사용)// exception::what
#include <iostream> // std::cout
#include <exception> // std::exception
struct ooops : std::exception {
const char* what() const throw() {return "Ooops!\n";}
};
int main () {
try {
throw ooops();
} catch (std::exception& ex) {
std::cout << ex.what();
}
return 0;
}
예외 상황을 처리할 때 필요한 변수나 함수를 멤버로 가진 클래스
예외 클래스는 Orthdox Canonical Form을 지키지 않아도 됨
Bureaucrat
클래스name
: 이름grade
: 등급 1 ~ 150 (1이 가장 높음)Bureaucrat::GradeTooHighException
Bureaucrat::GradeTooLowException
getName()
, getGrade()
try ~ catch
로 받을 수 있어야 함try
{
/* do some stuff with bureaucrats */
}
catch (std::exception &e)
{
/* handle exception */
}
<<
)를 오버로딩해서 아래와 같은 문구를 출력<name>, bureaucrat grade <grade>.
Form
클래스Form
의 등급은 Bureaucrat
의 등급과 같은 규칙을 따름Form::GradeTooHighException
Form::GradeTooLowException
Form
의 모든 정보를 출력하도록 삽입 연산자(<<
) 오버로딩name
false
)beSigned()
Bureaucrat
을 인자로 받음Form::GradeTooLowException
예외 던지기Bureaucat
클래스signForm()
추가<bureaucrat> signed <form>
출력<bureaucrat> couldn’t sign <form> because <reason>.
출력<cstdlib>
의 srand()
와 rand()
이용srand()
로 시드값을 초기화하지 않으면 1
로 고정이 되고, 터미널을 새로 시작할 때까지 난수 범위가 고정됨<ctime>
의 time()
활용)int main ()
{
int iSecret;
/* initialize random seed: */
srand (time(NULL));
/* generate secret number between 1 and 10: */
iSecret = rand() % 10 + 1;
...
return 0;
}
Form
상속Form
은 추상 클래스여야 함. Form
의 모든 멤버 변수는 그대로 privateShrubberyCreationForm
의 인자로 home
을 보냄ShrubberyCreationForm
클래스<target>_shrubbery
라는 파일을 생성하고 거기에 ASCII tree를 출력RobotomyRequestForm
클래스target
이 획일화(robotomized)되었다고 출력Makes some drilling noises. Then, informs that
<target>
has been robotomized
successfully 50% of the time. Otherwise, informs that the robotomy failed.
PresidentialPardonForm
클래스target
이 Zaphod Beeblebrox에 의해 사면(pardoned)되었다고 출력Form
클래스execute(Bureaucrat const & executor) const
추가Bureaucat
의 등급이 exec보다 같거나 높은지 검사Bureaucat
클래스executeForm(Form const & form)
추가<bureaucrat> executed <form>
출력Intern
클래스makeForm()
Intern creates <form>
출력if / elseif / else
구문 사용하지 말 것{
Intern someRandomIntern;
Form* rrf;
rrf = someRandomIntern.makeForm("robotomy request", "Bender");
}