์์ธ
abort() ํธ์ถ
ํ ๋งค๊ฐ๋ณ์๊ฐ ๋ค๋ฅธ ํ ๋งค๊ฐ๋ณ์์ ๋ถ์ ์ด๋ฉด, ๊ทธ ํจ์๊ฐ abort() ํจ์๋ฅผ ํธ์ถํ๊ฒ ๋ง๋๋ ๊ฒ์ด๋ค. abort() ํจ์์ ์ํ์ cstdlib(๋๋ stdlib.h) ํค๋ ํ์ผ์ ๋ค์ด์๋ค.
์ผ๋ฐ์ ์ผ๋ก abort() ํจ์๋, ํธ์ถ๋์์ ๋ ํ์ค ์๋ฌ ์คํธ๋ฆผ (cerr๊ฐ ์ฌ์ฉํ๋ ์คํธ๋ฆผ)์ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๊ณ ํ๋ก๊ทธ๋จ์ ์ข ๋ฃ์ํค๋๋ก ๊ตฌํ๋์ด ์๋ค.
๋ํ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ ์ํด ๊ธฐ๋ ๋ ๊ฒฝ์ฐ, ๊ทธ ํ๋ก๊ทธ๋จ์ ๋ถ๋ชจ ํ๋ก์ธ์ค๋ ์ด์์ฒด์ ์ ์ปดํ์ผ๋ฌ์ ์ข ์์ ์ธ ์ด๋ค ๊ฐ์ ๋ฆฌํดํ๋ค. ์ด๋ abort()๊ฐ ํ์ผ ๋ฒํผ๋ฅผ ๋น์ฐ๋์ง ์ฌ๋ถ๋ c++ ์์คํ ๋ง๋ค ๋ค๋ฅด๋ค. ์ํ๋ค๋ฉด exit()๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ์ง ์๊ณ , ํ์ผ ๋ฒํผ๋ง ์ง์ธ ์ ์๋ค.
์์ธ ๋ฉ์ปค๋์ฆ
- ์์ธ๋ฅผ ๋ฐ์์ํจ๋ค.
- ํธ๋ค๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ ์์ธ๋ฅผ ํฌ์ฐฉํ๋ค.
- try ๋ธ๋ก์ ์ฌ์ฉํ๋ค.
throw ํค์๋๋ ์์ธ์ ๋ฐ์์ ๋ํ๋ธ๋ค.
throw ํค์๋์ ๋ค์๋ ๊ทธ ์์ธ์ ํน์ง์ ๋ํ๋ด๋, ๋ฌธ์์ด์ด๋ ๊ฐ์ฒด์ ๊ฐ์ ํ๋์ ๊ฐ์ด ๋ค๋ฐ๋ฅธ๋ค.
catch ํค์๋๋ ์์ธ์ ํฌ์ฐฉ์ ๋ํ๋ธ๋ค.
๋ค์๋ ์์ธ ํธ๋ค๋ฌ๋ฅผ ์๋ตํ๊ฒ ๋ง๋ , ๊ทธ ์์ธ์ ๋ฐ์ดํฐํ ์ ์ธ์ด ์๊ดํธ์ ๋ํ๋๋ค. (throw ํค์๋์ ๋ค์ ๋์ค๋ ๋ฌธ์์ด์ด๋ ๊ฐ์ฒด์ ๊ฐ์ ํ๋์ ๊ฐ์ ๋ํ ๋ฐ์ดํฐํ ์ ์ธ) ๋ ๊ทธ ๋ค์๋ ์์ธ ํธ๋ค๋ฌ๊ฐ ์ทจํ ์กฐ์น๋ค์ ๋ํ๋ด๋ ์ฝ๋ ๋ธ๋ก์ด ์ค๊ดํธ๋ก ๋ฌถ์ฌ ๋ํ๋๋ค. ์์ธ ๋ฐ์ดํฐ์ ํจ๊ป ์ฌ์ฉ๋๋ catch ํค์๋๋, ์์ธ๊ฐ ๋ฐ์ํ์์ ๋ ํ๋ก๊ทธ๋จ์ ์คํ์ด ์ ํํ๋ ์ง์ ์ ๋ํ๋ด๋ ๋ ์ด๋ธ์ ์ญํ ์ ํ๋ค.
try ๋ธ๋ก์ ํน๋ณํ ์์ธ๋ค์ด ๋ฐ์ํ ์ ์๋ ํ๋์ ์ฝ๋ ๋ธ๋ก์ด๋ค. ๊ทธ ๋ค์๋ ํ๋ ์ด์์ catch ๋ธ๋ก๋ค์ด ๋์จ๋ค. try ๋ธ๋ก ์์ฒด๋ ํค์๋ try์ ์ํด ๋ํ๋๋ค. ๊ทธ ๋ค์๋ ์์ธ๋ค์ด ๋ฐ์ํ ์ ์๋ ์ฝ๋ ๋ธ๋ก์ด ์ค๊ดํธ๋ก ๋ฌถ์ฌ ๋ํ๋๋ค.
์์ธ๋ก ๊ฐ์ฒด ์ฌ์ฉํ๊ธฐ
์ผ๋ฐ์ ์ผ๋ก, ์์ธ๋ฅผ ๋ฐ์์ํค๋ ํจ์๋ค์ ๊ฐ์ฒด๋ฅผ ๋ฐ์์ํจ๋ค. ์๋ก ๋ค๋ฅธ ์์ธ ๋ฐ์ดํฐํ์ ์ฌ์ฉํจ์ผ๋ก์จ ์๋ก ๋ค๋ฅธ ํจ์๋ค๊ณผ ์์ธ๋ฅผ ๋ฐ์์ํค๋ ์ํฉ์ ๊ตฌ๋ณํ ์ ์๋ค. ๋ํ, ๊ฐ์ฒด ์์ฒด์ ์ ๋ณด๋ฅผ ์ ๋ฌํ ์ ์๋ค. ์ฌ์ฉ์๋ ์ด ์ ๋ณด๋ฅผ ์ฌ์ฉํ์ฌ ์์ธ๊ฐ ๋ฐ์ํ๋ ์ฌ๋ฌ ์กฐ๊ฑด๋ค์ ์๋ณํ ์ ์๋ค. catch ๋ธ๋ก์ ์ด ์ ๋ณด๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ค ์ก์ ์ฝ์ค๋ฅผ ์ทจํด์ผ ํ ์ง ๊ฒฐ์ ํ ์ ์๋ค.
c++11์์์ ์์ธ ๊ท๊ฒฉ
double harm(double a) throw(bad_thing);
//bad_thing exception์ ๋ฐ์ํ ์ ์๋ค.
double marm(double a) throw();
//exception์ ๋ฐ์ํ์ง ์๋๋ค.
throw() ๋ถ๋ถ์ ํ์ ๋ฆฌ์คํธ์ ์กด์ฌ ์ ๋ฌด์ ์๊ด์์ด ์์ธ ์ฌํญ์ด๋ฉฐ, ํจ์ ์ํ๊ณผ ํจ์ ์ ์์์ ๋ชจ๋ ๋ํ๋ ์ ์๋ค. ์ด๋ฌํ ์์ธ ์ฒ๋ฆฌ๋ฅผ ๋ง๋ ์ฒซ ๋ฒ์งธ ์ด์ ๋ ์ฌ์ฉ์์๊ฒ try ๋ธ๋ก์ ํ์์ฑ์ ์๋ ค์ฃผ๊ธฐ ์ํจ์ด๋ค. ๋ ๋ฒ์งธ ์ด์ ๋ ์ปดํ์ผ๋ฌ๋ก ํ์ฌ๊ธ ๋ฐํ์ ์ฒดํฌ์ฉ ์ฝ๋๋ฅผ ์ถ๊ฐํ์ฌ ์์ธ์ฌํญ์ด ์๋ฐ๋์ด ์๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํ๊ธฐ ์ํด์์ด๋ค. c++์ noexcept๋ผ๋ ์๋ก์ด ํค์๋๋ก์ ์์ธ๋ฅผ ๋ฐ์ํ์ง ์๋ ํจ์๋ฅผ ์ง์นญํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
double marm() noexcept; //marm() ์์ธ๋ฅผ ๋ฐ์ํ์ง ์๋๋ค.
์คํ ํ๊ธฐ
์ด๋ค try ๋ธ๋ก์ด, ์์ธ๋ฅผ ๋ฐ์์ํค๋ ํจ์๋ฅผ ์ง์ ํธ์ถํ์ง ์๊ณ , ๊ทธ ์์ธ๋ฅผ ๋ฐ์์ํค๋ ํจ์๋ฅผ ํธ์ถํ๋ ๋ค๋ฅธ ํจ์๋ฅผ ํธ์ถํ๋ค๊ณ ๊ฐ์ ํ์. ๊ทธ๋๋ ์ฌ์ ํ ์์ธ๋, ๊ทธ ์์ธ๊ฐ ๋ฐ์ํ ํจ์๋ก๋ถํฐ try๋ธ๋ก๊ณผ ํธ๋ค๋ฌ๊ฐ ๋ค์ด์๋ ํจ์๋ก ์ ํํ๋ค.
์ด ๊ณผ์ ์์๋ ์คํ ํ๊ธฐ๋ผ๋ ๊ฒ์ด ๊ด์ฌํ๋ค. ์ด๋ค ํจ์๊ฐ ๋ฆฌํด ํธ์ถ์ ํตํ์ง ์๊ณ ๋ฐ์๋ ์์ธ๋ฅผ ํตํด ์ข ๋ฃ๋๋ค๊ณ ๊ฐ์ ํ์. ์ด ๊ฒฝ์ฐ์๋ ํ๋ก๊ทธ๋จ์ ์คํ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ๋ค. ๊ทธ๋ฌ๋ ์คํ์์ ๋ง๋๋ ์ฒซ ๋ฒ์งธ ๋ฆฌํด ์ฃผ์์์ ๋ฉ์ถ์ง ์๊ณ , try ๋ธ๋ก์ ๋ค์ด์๋ ๋ฆฌํด ์ฃผ์์ ๋๋ฌํ ๋๊น์ง ๊ณ์ํด์ ์คํ์ ํด์ ํ๋ค. ์ด๋ ์ ์ด๋ ํจ์ ํธ์ถ ๋ค์ ์ค๋ ์ฒซ ๋ฒ์งธ ๊ตฌ๋ฌธ์ด ์๋๋ผ try ๋ธ๋ก์ ๋์ ์ด์ด์ง๋ ์์ธ ํธ๋ค๋ฌ๋ก ๋์ด๊ฐ๋ค. ์ด ๊ณผ์ ์ ์คํ ํ๊ธฐ๋ผ ๋ถ๋ฅธ๋ค.
์์ธ ๋ฐ์ ๋ฉ์ปค๋์ฆ์์ ๊ฐ์ฅ ์ค์ํ ํน์ง์, ํจ์ ๋ฆฌํด๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก, ์คํ์ ์ฌ๋ผ์ ์๋ ๋ชจ๋ ์๋ ํด๋์ค ๊ฐ์ฒด๋ค์ ๋ํด์ ํด๋์ค ํ๊ดด์๋ค์ด ํธ์ถ๋๋ค๋ ๊ฒ์ด๋ค.
์์ธ์ ๊ทธ ๋ฐ์ ๊ธฐ๋ฅ
throw-catch ๋ฉ์ปค๋์ฆ์ ํจ์ ๋งค๊ฐ๋ณ์์ ์ ๋ฌ ๋ฉ์ปค๋์ฆ๊ณผ ๋ง์ด ๋น์ทํ์ง๋ง ์ฝ๊ฐ ์ฐจ์ด๊ฐ ์๋ค. ํจ์ fun()์ ์๋ return ๊ตฌ๋ฌธ์ fun()์ ํธ์ถํ ํจ์์ ์คํ์ ์ฎ๊ธด๋ค. ๊ทธ๋ฌ๋ throw๋ ๊ทธ ์์ธ๋ฅผ ํฌ์ฐฉํ try-catch ์กฐํฉ์ด ์๋ ์ฒซ ๋ฒ์งธ ํจ์์ ๋๋ฌํ ๋๊น์ง ์คํ์ ๊ณ์ ์ฎ๊ธด๋ค.
๋ ํ ๊ฐ์ง ์ฐจ์ด๋, ์์ธ ์ง์ ์๋ catch ๋ธ๋ก์ด ์ฐธ์กฐ๋ฅผ ์ง์ ํ ์ง๋ผ๋ ์ปดํ์ผ๋ฌ๋ ์ธ์ ๋ ์์ธ๊ฐ ๋ฐ์ํ ๋ ์์ ๋ณต์ฌ๋ณธ์ ๋ง๋ ๋ค. ์ฆ, catch ๋ธ๋ก์ ์์ ๋ณต์ฌ๋ณธ์ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํจ. ์์ ๋ณต์ฌ๋ณธ์์๋ ๋ถ๊ตฌํ๊ณ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ ๊ธฐ์ด ํด๋์ค ์ฐธ์กฐ๋ ํ์ ํด๋์ค ๊ฐ์ฒด๋ ์ฐธ์กฐํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์์ธ๋ค์ ํด๋์ค ๊ณ์ธต์ ๊ฐ์ง๊ณ ์๊ณ , ์๋ก ๋ค๋ฅธ ๋ฐ์ดํฐํ๋ค์ ๋ฐ๋ก๋ฐ๋ก ์ฒ๋ฆฌํ๊ธฐ๋ฅผ ์ํ๋ค๋ฉด, ๊ธฐ์ด ํด๋์ค ์ฐธ์กฐ๋ ํจ๋ฐ๋ฆฌ์ ๋ชจ๋ ๊ฐ์ฒด๋ค์ ํฌ์ฐฉํ ์ ์์ง๋ง ํ์ ํด๋์ค ๊ฐ์ฒด๋ ๊ทธ ํด๋์ค๋ก๋ถํฐ ํ์๋ ํด๋์ค์ ๊ฐ์ฒด๋ค๋ง ํฌ์ฐฉํ ์ ์๋ค. catch ๋ธ๋ก๋ค์ ํ์ ์์์ ์ญ์์ผ๋ก ๋ฐฐ์นํด์ผ ํ๋ค.
class bad_1 {...};
class bad_2 : public bad_1 {...};
class bad_3 : public bad_2 {...};
...
//๊ธฐ์ด ํด๋์ค ๊ฐ์ฒด์ ํ์ ํด๋์ค ๊ฐ์ฒด๋ฅผ ๋งค์น ์ํจ๋ค.
void duper() throw(bad_1)
{
...
if(oh_no)
throw bad_1();
if(rats)
throw bad_2();
if(drat)
throw bad_3();
}
...
try{
duper();
}
catch(bad_3 &be)
{...}
catch(bad_2 &be)
{...}
catch(bad_1 &be)
{...}
์ด๋ค ์์ธ๋ผ๋ ํฌ์ฐฉํ๋ ๋น๊ฒฐ์ ์์ธ ๋ฐ์ดํฐํ์ ๋ํด ์๋ต ๋ถํธ(...)๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
catch(...){//๊ตฌ๋ฌธ๋ค} //์ด๋ค ์์ธ ๋ฐ์ดํฐํ๋ ํฌ์ฐฉํ๋ค.
๋ฐ์๋๋ ์์ธ๋ค์ ์๊ณ ์๋ค๋ฉด, ์ด์ ๊ฐ์ ํฌ๊ด ํ์์ catch ๋ธ๋ก ์ํ์ค์ ๋์ ๋์ ์ ์๋ค. ์ด๊ฒ์ switch์ default ์ผ์ด์ค์ ์ฝ๊ฐ ๋น์ทํ๋ค.