์์ธ ์ฒ๋ฆฌ(Exception Handling)์ ์ค์ฒฉ ํด๋์ค(Nested Class)๋ฅผ ํ์ตํ๋ ๋ชจ๋์ ๋๋ค. ๊ด๋ฃ์ ์๋ฎฌ๋ ์ด์ ์ ํตํด ์์ธ ์ํฉ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋๋ค.
์ฃผ์ ํ์ต ํฌ์ธํธ:
- ์์ธ ์ฒ๋ฆฌ (try, catch, throw)
- ์ฌ์ฉ์ ์ ์ ์์ธ ํด๋์ค
- ์ค์ฒฉ ํด๋์ค (Nested Class)
- ์์ธ ์์ ์ฑ (Exception Safety)
- RAII (Resource Acquisition Is Initialization)
ex00: Mommy, when I grow up, I want to be a bureaucrat!
- Bureaucrat ํด๋์ค ๊ตฌํ
- ์์ฑ: name (const), grade (1-150)
- ๋ฑ๊ธ ๋ฒ์ ๊ฒ์ฆ ๋ฐ ์์ธ ์ฒ๋ฆฌ
- ์ค์ฒฉ ์์ธ ํด๋์ค: GradeTooHighException, GradeTooLowException
- ๋ฉค๋ฒ ํจ์: incrementGrade, decrementGrade
ex01: Form up, maggots!
- Form ํด๋์ค (ํ์ AForm์ผ๋ก ๋ณ๊ฒฝ)
- ์์ฑ: name (const), signed (bool), gradeToSign, gradeToExecute
- beSigned() ํจ์๋ก ์๋ช ์ฒ๋ฆฌ
- Bureaucrat์ signForm() ํจ์
- ์์ธ: GradeTooHighException, GradeTooLowException
ex02: No, you need form 28B, not 28C...
- AForm ์ถ์ ํด๋์ค
- ๊ตฌ์ฒด ํด๋์ค: ShrubberyCreationForm, RobotomyRequestForm, PresidentialPardonForm
- execute() ์์ ๊ฐ์ ํจ์
- ๊ฐ ํผ์ ๊ณ ์ ์คํ ๋ก์ง
- ์คํ ์กฐ๊ฑด ๊ฒ์ฆ
ex03: At least this beats coffee-making
- Intern ํด๋์ค
- makeForm() ํจ์๋ก ๋์ ํผ ์์ฑ
- ํผ ์ด๋ฆ์ผ๋ก ์ ์ ํ ํผ ๊ฐ์ฒด ์์ฑ
- ํฉํ ๋ฆฌ ํจํด (Factory Pattern) ํ์ฉ
์์ธ ์ฒ๋ฆฌ (Exception Handling)
- try-catch ๋ธ๋ก์ผ๋ก ์์ธ ์ํฉ์ ์ฒ๋ฆฌ
- throw๋ก ์์ธ๋ฅผ ๋ฐ์์ํค๊ณ , catch์์ ํฌ์ฐฉํ์ฌ ์ฒ๋ฆฌ
- std::exception์ ์์๋ฐ์ ์ฌ์ฉ์ ์ ์ ์์ธ ํด๋์ค ์์ฑ
์ค์ฒฉ ํด๋์ค (Nested Class)
- ํด๋์ค ๋ด๋ถ์ ์ ์๋ ํด๋์ค
- ์ธ๋ถ ํด๋์ค์ ๋ฐ์ ํ ๊ด๋ จ์ด ์์ ๋ ์ฌ์ฉ
- GradeTooHighException, GradeTooLowException ๋ฑ์ Bureaucrat ํด๋์ค ๋ด๋ถ์ ์ ์
์ถ์ ํด๋์ค์ ์์ ๊ฐ์ ํจ์
- ์์ ๊ฐ์ ํจ์ (= 0)๋ฅผ ํฌํจํ ํด๋์ค๋ ์ธ์คํด์คํ ๋ถ๊ฐ
- ํ์ ํด๋์ค์์ ๋ฐ๋์ ๊ตฌํํด์ผ ํจ
- AForm ํด๋์ค๊ฐ ์ถ์ ํด๋์ค, execute()๊ฐ ์์ ๊ฐ์ ํจ์
ํผ ํด๋์ค ๊ตฌ์กฐ
- ShrubberyCreationForm: ASCII ํธ๋ฆฌ๋ฅผ ํ์ผ์ ์์ฑ (sign 145, exec 137)
- RobotomyRequestForm: 50% ํ๋ฅ ๋ก ๋ก๋ดํ ์๋ (sign 72, exec 45)
- PresidentialPardonForm: ๋ํต๋ น ์ฌ๋ฉด ๋ฉ์์ง ์ถ๋ ฅ (sign 25, exec 5)
ํฉํ ๋ฆฌ ํจํด
- Intern ํด๋์ค๊ฐ ํผ ์ด๋ฆ์ ๋ฐ์ ์ ์ ํ ํผ ๊ฐ์ฒด๋ฅผ ๋์ ์ผ๋ก ์์ฑ
- ๊ฐ์ฒด ์์ฑ ๋ก์ง์ ์บก์ํํ์ฌ ์ฝ๋ ์ ์ฐ์ฑ ํฅ์
- ํจ์ ํฌ์ธํฐ ๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ ํผ ์์ฑ ํจ์ ๋งคํ
์์ธ ์์ ์ฑ
- Basic guarantee: ์์ธ ๋ฐ์ ์ ์ ํจํ ์ํ ์ ์ง
- Strong guarantee: ์์ธ ๋ฐ์ ์ ์ํ ๋ณ๊ฒฝ ์์
- No-throw guarantee: ์์ธ๋ฅผ ๋์ง์ง ์์
c++ -Wall -Wextra -Werror -std=c++98 *.cpp -o bureaucrat๊ฐ exercise์์:
make- ์์ธ ํด๋์ค ์์:
std::exception์์ - what() ํจ์:
const throw()์ง์ ์ ์ฌ์ฉ (C++98) - const ์ ํ์ฑ: const ๋ฉค๋ฒ ๋ณ์๋ ์ด๊ธฐํ ๋ฆฌ์คํธ์์ ์ด๊ธฐํ
- ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ: ๋์ ํ ๋น๋ ํผ ๊ฐ์ฒด ํด์
- ๋ฑ๊ธ ๊ฒ์ฆ: ์์ฑ์์ ๋ฉค๋ฒ ํจ์์์ ํญ์ ๋ฒ์ ํ์ธ
- Orthodox Canonical Form: ๋ณต์ฌ ์์ฑ์, ๋์ ์ฐ์ฐ์ ๊ตฌํ