์์ธ๋ ์ ์์ ์ด์ง ์์ ์ํฉ์ด ์ผ๊ธฐํ์ ๋ ๋ฐ์ํ๋ ์ด๋ฒคํธ๋ฅผ ๋งํ๋ค
์ ํต์ ์ธ ์์ธ ์ฒ๋ฆฌ๋ฐฉ๋ฒ์ ์์ธ๋ฅผ ์์ํด์ if๋ฌธ์ ํตํด ๊ทธ์ ๋ํ ๋ฐํ๊ฐ์ ์ ํ์ฌ์ ๋ฏธ๋ฆฌ ์์ธ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ผ๋ก ํ๋ ๊ฒ์ด๋ค
throw, try, catch
C++์์๋ throw, try, catch๋ฅผ ํตํด ์์ธ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ค.
- throw: ์์ธ๋ฅผ ๋ฐ์์ํด.
- try: ์์ธ๊ฐ ๋ฐ์ํ ์ ์๋ ์ฝ๋๋ฅผ ๊ฐ์ธ์ ๋ณดํธ.
- catch: ๋ฐ์ํ ์์ธ๋ฅผ ์ฒ๋ฆฌ.
throw : ์์ธ ๋ฐ์
- throw๋ ํน์ ์กฐ๊ฑด์์ ์์ธ๋ฅผ ๋ฐ์์ํฌ ๋ ์ฌ์ฉ๋๋ค. ์์ธ๋ฅผ ๋ฐ์์ํค๋ฉด ํ๋ก๊ทธ๋จ์ ํ์ฌ ํ๋ฆ์ ์ค๋จ๋๊ณ , ๊ฐ์ฅ ๊ฐ๊น์ด catch ๋ธ๋ก์์ ์์ธ๋ฅผ ์ฒ๋ฆฌํ๋ ค๊ณ ์๋ํ๋ค.
int divide(int a, int b) {
if (b == 0) {
throw "Division by zero error"; // 0์ผ๋ก ๋๋๋ฉด ์์ธ ๋ฐ์
}
return a / b;
}
try: ์์ธ ๊ฐ์ง
- try ๋ธ๋ก์ ์์ธ๊ฐ ๋ฐ์ํ ์ ์๋ ์ฝ๋๋ฅผ ๊ฐ์ธ์ ๋ณดํธํ๋ค. ๋ง์ฝ try ๋ธ๋ก ์์์ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด, throw๊ฐ ํธ์ถ๋์ด ์์ธ๊ฐ ๋์ ธ์ง๊ณ , ํด๋น ์์ธ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ catch ๋ธ๋ก์ด ์คํ๋๋ค
try {
int result = divide(10, 0); // ์ด ํจ์์์ ์์ธ ๋ฐ์
}
catch: ์์ธ ์ฒ๋ฆฌ
- catch ๋ธ๋ก์ throw์ ์ํด ๋์ ธ์ง ์์ธ๋ฅผ ์ฒ๋ฆฌํ๋ค. throw์์ ๋์ ธ์ง ๊ฐ์ catch ๋ธ๋ก์ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ๋๋ค. catch ๋ธ๋ก์ try ๋ธ๋ก์ ์ธ์ ํด ์์ด์ผ ํ๋ฉฐ, ์์ธ๋ฅผ ์ฒ๋ฆฌํ ํ ํ๋ก๊ทธ๋จ์ ํ๋ฆ์ catch ์ดํ ์ฝ๋๋ก ์ด์ด์ง๋ค
catch (const char* errorMessage) {
cout << errorMessage << endl; // ์์ธ ์ฒ๋ฆฌ
}
ex)
<๋ค์ค try catch ๊ตฌ๋ฌธ>
ex)
try {
// ์์ธ ๋ฐ์ ๊ฐ๋ฅ ์ฝ๋
} catch (int e) {
cout << "Caught an integer exception: " << e << endl;
} catch (const char* e) {
cout << "Caught a string exception: " << e << endl;
} catch (...) {
cout << "Caught an unknown exception" << endl; // ๋ชจ๋ ์์ธ ์ฒ๋ฆฌ
}
Standard Exceptions (ํ์ค ์์ธ)
C++ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ๋ก๊ทธ๋จ ์คํ ์ค์ ๋ฐ์ํ ์ ์๋ ๋ค์ํ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์์ธ ํด๋์ค๋ฅผ ์ ๊ณตํ๋ค. ์ด๋ฌํ ์์ธ ํด๋์ค๋ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ์ด๋ฃจ๊ณ ์์ผ๋ฉฐ, ๊ธฐ๋ณธ ํด๋์ค์ธ std::exception์ ์์ํ์ฌ ๊ตฌ์ฒด์ ์ธ ์์ธ ์ํฉ์ ์ ์ํ๋ค.
์ธ์ด์ ์ํด ๋ฐ์ํ๋ ์์ธ (thrown by language) : ์ธ์ด ์์ฒด์์ ๋ฐ์ํ๋ ์์ธ๋ค
- bad_alloc: ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์คํจ ์ ๋ฐ์ (new ์ฐ์ฐ์).
- bad_cast: ์๋ชป๋ ํ์ ์บ์คํ ์ด ๋ฐ์ํ ๋ (dynamic_cast).
- bad_typeid: typeid ์ฐ์ฐ์๊ฐ ์ ํจํ์ง ์์ ํ์์ ๋ํด ํธ์ถ๋ ๋.
- bad_exception: ์ ์ธ๋ ์์ธ๊ฐ ์๋ ๋ค๋ฅธ ์์ธ๊ฐ ๋ฐ์ํ ๋.
ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์์ ์ํด ๋ฐ์ํ๋ ์์ธ (thrown by standard library functions)
- out_of_range: ์ปจํ ์ด๋์์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ์ก์ธ์ค๋ฅผ ์๋ํ ๋ ๋ฐ์ (at() ํจ์).
- invalid_argument: ์๋ชป๋ ์ธ์ ์ ๋ฌ ์ ๋ฐ์ (bitset์ ์ฐ์ฐ์ ๋๋ ์์ฑ์).
- overflow_error: ์ฐ์ ์ค๋ฒํ๋ก ๋ฐ์ ์ ๋ฐ์ (bitset::to_ulong()).
- io_base::failure: ์ ์ถ๋ ฅ ์คํธ๋ฆผ์์ ์คํจ ์ ๋ฐ์ (io_base::clear()).
์์ธ ํด๋์ค(Exception Class)
๊ธฐ๋ณธ์ ์ธ ์์ธ ์ฒ๋ฆฌ๋ฅผ ์ํด MyException์ด๋ผ๋ ์์ธ ํด๋์ค๋ฅผ ์ ์ํ๊ณ ์๋ค.
- MyException ํด๋์ค๋ print()๋ผ๋ ๋ฉค๋ฒ ํจ์๋ฅผ ํตํด ์์ธ๊ฐ ๋ฐ์ํ์ ๋ ์ถ๋ ฅํ ๋ฉ์์ง๋ฅผ ์ ์ํ๋ค.
- ์ด ์์ธ ํด๋์ค๋ 0์ผ๋ก ๋๋๊ธฐ์ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ ๋ throw๋๊ณ , ๊ทธ ํ catch ๋ธ๋ก์์ ํด๋น ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ค.
ํด๋์ค ๋ง๋ค๊ณ , ํจ์์ฒ๋ผ ํธ์ถํ๋ฉด ๋๋ค. ํด๋์ค ์ด๋ฆ(ex MyException)์ ๋ง์๋๋ก ์ง์ผ๋ฉด ๋๋ค.
ํ ํ๋ฆฟ ์์ธ ํด๋์ค(Template Exception Class)
ํ ํ๋ฆฟ ์์ธ ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ํ ํ์ ์ ์์ธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ๊ตฌ์กฐ์ด๋ค. ์์์์ find ํจ์๋ ๋ฐฐ์ด์ด nullptr์ด๊ฑฐ๋ ํฌ๊ธฐ๊ฐ 0 ์ดํ์ผ ๋ ์์ธ๋ฅผ ๋์ง๊ณ , ์ํ๋ ๊ฐ์ ์ฐพ์ง ๋ชปํ์ ๋๋ ์์ธ๋ฅผ ๋์ง๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ๋ฉ์์ง๋ก ์ถ๋ ฅํ๋ค.
ex) "Not found"
'C Programming Language > C++' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
C++ ์ ์บ์คํ , ๋คํ์ฑ, ๋ค์ค ์์๊ณผ ๊ฐ์ ์์, ๊ฐ์ ํจ์ (2) | 2024.09.04 |
---|---|
C++ Inheritance(์์), ์์๊ณผ ์ค๋ฒ๋ก๋ฉ, ํ ํ๋ฆฟ๊ณผ ์์์ ๊ด๊ณ (0) | 2024.09.01 |
C++ ํด๋์ค(Class)์ ์ข ๋ฅ์ ์ถ์ ํด๋์ค(abstract classes) (0) | 2024.08.31 |
C++ Generic Programming : ํ ํ๋ฆฟ(Templates) (0) | 2024.08.31 |
C++ ์ฐ์ฐ์ ์ค๋ฒ๋ก๋ฉ(Operator Overloading) (0) | 2024.08.31 |