C Programming Language/C++

C++ ์˜ˆ์™ธ(Exception) ์ฒ˜๋ฆฌ(Handling) : throw, try, catch

567Rabbit 2024. 9. 6. 15:11

์˜ˆ์™ธ๋ž€ ์ •์ƒ์ ์ด์ง€ ์•Š์€ ์ƒํ™ฉ์ด ์•ผ๊ธฐํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ๋ฅผ ๋งํ•œ๋‹ค

์ „ํ†ต์ ์ธ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฐฉ๋ฒ•์€ ์˜ˆ์™ธ๋ฅผ ์˜ˆ์ƒํ•ด์„œ 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"