๋ฐ˜์‘ํ˜•

๊ตฌ์กฐ์  ์˜ˆ์™ธ ์ฒ˜๋ฆฌ(SEH)๋ž€?

๊ตฌ์กฐ์  ์˜ˆ์™ธ ์ฒ˜๋ฆฌ(์ดํ•˜ SEH)๋Š” ํ•˜๋“œ์›จ์–ด์™€ ์†Œํ”„ํŠธ์›จ์–ด ์˜ˆ์™ธ๋ฅผ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•˜๋Š” Microsoft Windows์˜ ๊ธฐ๋ณธ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. ํ•˜๋“œ์›จ์–ด ์˜ˆ์™ธ๋Š” ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ ์ฃผ์ฒด๊ฐ€ CPU์™€ ๊ฐ™์€ ํ•˜๋“œ์›จ์–ด๋ผ๋Š” ๊ฒƒ์ด๊ณ , ์†Œํ”„ํŠธ์›จ์–ด ์˜ˆ์™ธ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์„ฑํ•œ ์†Œํ”„ํŠธ์›จ์–ด ๋ฐ ์šด์˜์ฒด์ œ๊ฐ€ ์˜ˆ์™ธ์˜ ์ฃผ์ฒด๋ผ๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

์ข€ ๋” ์‰ฌ์šด ์˜ˆ๋ฅผ ๋“ค์ž๋ฉด, ์–ด๋–ค ์ˆ˜๋ฅผ 0์œผ๋กœ ๋‚˜๋ˆ„๋Š” ์—ฐ์‚ฐ์ด๋‚˜ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผ์„ ์‹œ๋„ํ•˜๋Š” ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•œ๋‹ค๋ฉด ํ•˜๋“œ์›จ์–ด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ , ์œ ํšจํ•˜์ง€ ์•Š์€ ์ธ์ž์— ๊ฐ’์„ ์ง€์ •ํ•  ๋•Œ ์†Œํ”„ํŠธ์›จ์–ด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ฒ˜๋Ÿผ, ํ•˜๋“œ์›จ์–ด์™€ ์†Œํ”„ํŠธ์›จ์–ด ์˜ˆ์™ธ๋ฅผ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด SEH์ž…๋‹ˆ๋‹ค.

https://docs.microsoft.com/ko-kr/windows/win32/debug/structured-exception-handling

 

๊ตฌ์กฐ์  ์˜ˆ์™ธ ์ฒ˜๋ฆฌ - Win32 apps

์˜ˆ์™ธ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋Š” ๋™์•ˆ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ๋กœ, ์ •์ƒ์ ์ธ ์ œ์–ด ํ๋ฆ„ ์™ธ๋ถ€์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

docs.microsoft.com

์‚ฌ์‹ค ์ผ๋ฐ˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๊ฐœ๋ฐœ์ž๋ผ๋ฉด SEH์— ๋Œ€ํ•ด ๊นŠ๊ฒŒ ์•Œ ํ•„์š”๋Š” ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. SEH๋Š” ์ฃผ๋กœ ์šด์˜์ฒด์ œ๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋กœ, ์ผ๋ฐ˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๊ฐœ๋ฐœ์ž๋Š” ์–ธ์–ด์—์„œ ์ง€์›ํ•˜๋Š” ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ์ž˜ ๋‹ค๋ค„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, C++ ํ”„๋กœ๊ทธ๋žจ์€ C++ ๋ฌธ๋ฒ•์ธ try-catch, throw๋ฅผ ์ด์šฉํ•˜์—ฌ ์˜ˆ์™ธ๋ฅผ ๋‹ค๋ฃจ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก , SEH๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋ฌด๋ฐฉํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ, C++ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ์ปดํŒŒ์ผ๋Ÿฌ์™€ ์œˆ๋„์šฐ๊ฐ€ ์ง€์›ํ•˜๋Š” SEH ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

SEH ๊ธฐ๋ณธ ๋ฌธ๋ฒ•

SEH๋Š” ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ๊ธฐ๋Šฅ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ, ์ข…๋ฃŒ ์ฒ˜๋ฆฌ๊ธฐ์™€ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ธฐ์ž…๋‹ˆ๋‹ค. ๊ฐ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•ด ์ฐจ๋ก€๋Œ€๋กœ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

1. ์ข…๋ฃŒ ์ฒ˜๋ฆฌ๊ธฐ(Termination Handler)

์ข…๋ฃŒ ์ฒ˜๋ฆฌ๊ธฐ๋Š” __try ๋ธ”๋ก ๋‚ด์˜ ์ œ์–ด๊ฐ€ ์–ด๋–ป๊ฒŒ ๋น ์ ธ๋‚˜์˜ค๋“  __finally ๋ธ”๋ก์˜ ์ฝ”๋“œ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์ˆ˜ํ–‰๋  ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์ œ๋Š” ์ข…๋ฃŒ ์ฒ˜๋ฆฌ๊ธฐ SEH ๊ตฌ๋ฌธ์ž…๋‹ˆ๋‹ค.

__try
{
//...
}
__finally
{
//์ข…๋ฃŒ ์ฒ˜๋ฆฌ๊ธฐ
//...
}

์šด์˜ ์ฒด์ œ์™€ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํ•ญ์ƒ ์ข…๋ฃŒ ์ฒ˜๋ฆฌ๊ธฐ์˜ ์ฝ”๋“œ๊ฐ€ ์ˆ˜ํ–‰๋˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ๋‹จ, ExitProcess, ExitThread, TerminateProcess, TerminateThread์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค๋‚˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋Š” ๊ฒฝ์šฐ๋Š” ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์„ ์ œ์™ธํ•˜๊ณค, __try ๋ธ”๋ก ๋‚ด์—์„œ return, goto์™€ ๊ฐ™์€ ๋ฌธ์„ ํ˜ธ์ถœํ•˜๋”๋ผ๋„ ์ข…๋ฃŒ ์ฒ˜๋ฆฌ๊ธฐ๋Š” ํ•ญ์ƒ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ, ์–ด๋–ป๊ฒŒ ์ข…๋ฃŒ ์ฒ˜๋ฆฌ๊ธฐ์ธ __finally ๋ธ”๋ก์ด ํ•ญ์ƒ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์ผ๊นŒ์š”? ์ด๋Š”, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ __try ๋ธ”๋ก ๋‚ด์—์„œ ๋น ์ ธ๋‚˜๊ฐ€๊ธฐ ์ „์— __finally ๋ธ”๋ก์„ ๋ฐ˜๋“œ์‹œ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ์ถ”๊ฐ€์ ์ธ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ๋กœ์ปฌ ์–ธ์™€์ธ๋“œ(Local Unwind)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋กœ์ปฌ ์–ธ์™€์ธ๋“œ(Local Unwind)

์•ž์„œ ์„ค๋ช…ํ•œ ๋Œ€๋กœ, ์‹œ์Šคํ…œ์ด __try ๋ธ”๋ก์„ ๋น ์ ธ๋‚˜๊ฐ€๊ธฐ ์ „์— __finally ๋ธ”๋ก์„ ๋จผ์ € ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ '์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€๋กœ ์ƒ์„ฑํ•œ๋‹ค'๋ผ๋Š” ์กฐ๊ฑด์ด ๋ˆˆ์— ๋„๋Š”๋ฐ์š”. ์ถ”๊ฐ€์ ์ธ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๊ฒฐ๊ตญ ๋น„์šฉ์ด ๋ฐœ์ƒํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐœ์ƒํ•œ ๋น„์šฉ์€ ํ”„๋กœ๊ทธ๋žจ ์ˆ˜ํ–‰ ์„ฑ๋Šฅ์—๋„ ์ข‹์ง€ ์•Š์€ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ, ๋กœ์ปฌ ์–ธ์™€์ธ๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ์ œ์–ด์˜ ํ๋ฆ„์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. __try ๋ธ”๋ก์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ __finally ๋ธ”๋ก์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋น„์šฉ์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๋˜ ํ•˜๋‚˜์˜ ์ฃผ์˜ ์‚ฌํ•ญ์œผ๋กœ, __try ๋ธ”๋ก์—์„œ๋Š” ์„œ๋‘˜๋Ÿฌ์„œ ๋น ์ ธ๋‚˜๊ฐ€๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, return, goto, continue, break์™€ ๊ฐ™์€ ๋ฌธ์žฅ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋กœ์ปฌ ์–ธ์™€์ธ๋“œ์™€ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์•„๋„ ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์ข€ ๋” ์ž‘์€ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ณ  ์ด๋Š” ์ตœ์†Œํ•œ์˜ ๋น„์šฉ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ข€ ๋” ๋น ๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

__leave ํ‚ค์›Œ๋“œ

__try ๋ธ”๋ก ๋‚ด์—์„œ __leave ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด __try ๋ธ”๋ก์˜ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ด๋™ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์•ž์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ, ์ฝ”๋“œ ์ˆ˜ํ–‰ ํ๋ฆ„์ด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ __try ๋ธ”๋ก์—์„œ __finally ๋ธ”๋ก์œผ๋กœ ์ด๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋– ํ•œ ์ถ”๊ฐ€ ๋น„์šฉ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

2. ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ธฐ(Exception Handler)

์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ธฐ๋Š” __try ๋ธ”๋ก์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋˜ ์ค‘ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด __except ๋ฌธ์—์„œ ํ•„ํ„ฐ๋ฅผ ํ‰๊ฐ€ํ•˜์—ฌ ์ถ”๊ฐ€ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์ œ๋Š” ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ธฐ SEH ๊ตฌ๋ฌธ์ž…๋‹ˆ๋‹ค.

__try
{
//...
}
__except (์˜ˆ์™ธ ํ•„ํ„ฐ)
//์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ธฐ
//...
}

์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ธฐ์˜ ์˜ˆ์™ธ ํ•„ํ„ฐ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•  ๋‚ด์šฉ์ด ๋” ์žˆ์Šต๋‹ˆ๋‹ค. ๊นŠ๊ฒŒ ๋“ค์–ด๊ฐ€๊ธฐ ์ „์—, SEH ๋ฌธ๋ฒ•์— ๋Œ€ํ•ด ์ž ๊น ์ •๋ฆฌํ•˜๊ณ  ์„ค๋ช…์„ ์ด์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค.

SEH ๋ฌธ๋ฒ• ์ค‘๊ฐ„ ์ •๋ฆฌ

SEH ๋ฌธ๋ฒ•์ธ __try ๋ธ”๋ก์„ ๋งŒ๋“ค๋ฉด ๋ฐ˜๋“œ์‹œ ์ข…๋ฃŒ ์ฒ˜๋ฆฌ๊ธฐ์ธ __finally ๋ธ”๋ก ๋˜๋Š” ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ธฐ์ธ __except ๋ธ”๋ก์ด ๋”ฐ๋ผ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. __try ๋ธ”๋ก์€ __finally ๋ธ”๋ก๊ณผ __except ๋ธ”๋ก์„ ๋™์‹œ์— ๊ฐ€์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—ฌ๋Ÿฌ ๊ฐœ์˜ __except ๋ธ”๋ก๋„ ๊ฐ€์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ __try-__finally ๋ธ”๋ก ๋‚ด์— __try-__except ๋ธ”๋ก์„ ํฌํ•จ์‹œํ‚ค๊ฑฐ๋‚˜ ๋˜๋Š” ๊ทธ ๋ฐ˜๋Œ€๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

3. ์˜ˆ์™ธ ํ•„ํ„ฐ

๊ณ„์†ํ•ด์„œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ธฐ์˜ ์˜ˆ์™ธ ํ•„ํ„ฐ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜ˆ์™ธ ํ•„ํ„ฐ๋Š” ์ด ์„ธ ๊ฐ€์ง€๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ๊ฐ ํ•„ํ„ฐ๋งˆ๋‹ค ์„œ๋กœ ๋‹ค๋ฅธ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

3-1. EXCEPTION_EXECUTE_HANDLER

__try
{
//...
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
//์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ˆ˜ํ–‰
//...
}

๊ธ€๋กœ๋ฒŒ ์–ธ์™€์ธ๋“œ(Global Unwind)๋ฅผ ์ˆ˜ํ–‰ํ•œ ํ›„ __except ๋ธ”๋ก์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. __except ๋ธ”๋ก์˜ ์ฝ”๋“œ๊ฐ€ ๋ชจ๋‘ ์ˆ˜ํ–‰๋˜๊ณ  ๋‚˜๋ฉด __except ๋ฐ”๋กœ ๋‹ค์Œ์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ธ€๋กœ๋ฒŒ ์–ธ์™€์ธ๋“œ(Global Unwind)

์•ž์—์„œ ์ข…๋ฃŒ ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์„ค๋ช…ํ•  ๋•Œ ๋กœ์ปฌ ์–ธ์™€์ธ๋“œ๋ฅผ ์„ค๋ช…ํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„์ด ๋น„์Šทํ•œ ๊ธ€๋กœ๋ฒŒ ์–ธ์™€์ธ๋“œ๋ฅผ ์™œ ์ง€๊ธˆ ์–ธ๊ธ‰ํ–ˆ๋ƒ๋ฉด, ๊ธ€๋กœ๋ฒŒ ์–ธ์™€์ธ๋“œ๋Š” ์˜ˆ์™ธ ํ•„ํ„ฐ๊ฐ€ EXCEPTION_EXECUTE_HANDLER ์ผ ๋•Œ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์˜ˆ์™ธ ํ•„ํ„ฐ๊ฐ€ EXCEPTION_EXECUTE_HANDLER๋กœ ํ‰๊ฐ€๋˜๋ฉด __try-__except ๋ธ”๋ก ๋‚ด์˜ ๋ชจ๋“  __try-__finally ๋ธ”๋ก์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์„ ๊ธ€๋กœ๋ฒŒ ์–ธ์™€์ธ๋“œ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๊ธ€๋กœ๋ฒŒ-์–ธ์™€์ธ๋“œ-์ˆ˜ํ–‰-ํ๋ฆ„
๊ธ€๋กœ๋ฒŒ ์–ธ์™€์ธ๋“œ ์ˆ˜ํ–‰ ํ๋ฆ„

3-2. EXCEPTION_CONTINUE_EXECUTION

__try
{
//...
}
__except(EXCEPTION_CONTINUE_EXECUTION)
{
//์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ˆ˜ํ–‰
//...
}

์˜ˆ์™ธ ํ•„ํ„ฐ๊ฐ€ EXCEPTION_CONTINUE_EXECUTION๋กœ ํ‰๊ฐ€๋˜๋ฉด ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒํ–ˆ๋˜ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ํ•œ๋ฒˆ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ, ์˜ˆ์™ธ ๋ฐœ์ƒ ํ›„ ์ ์ ˆํ•œ ์กฐ์น˜๊ฐ€ ์ทจํ•ด์ง€์ง€ ์•Š์•˜๋‹ค๋ฉด ๋‹ค์‹œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๊ฒ ์ฃ . ์ด ๊ฒฝ์šฐ ๋˜ ๋‹ค๋ฅธ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ๊ณ  ๋˜๋Š” ๋ฌดํ•œ ๋ฃจํ”„์— ๋น ์งˆ ๊ฐ€๋Šฅ์„ฑ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ณง ๋””๋ฒ„๊น…์ด ์–ด๋ ค์›Œ ๋ฌธ์ œ ํ•ด๊ฒฐ์— ์–ด๋ ค์›€์ด ๋ฐœ์ƒํ•˜๊ฒ ์ฃ .

3-3. EXCEPTION_CONTINUE_SEARCH

__try
{
//...
}
__except(EXCEPTION_CONTINUE_SEARCH)
{
//์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ˆ˜ํ–‰
//...
}

์˜ˆ์™ธ ํ•„ํ„ฐ๊ฐ€ EXCEPTION_CONTINUE_SEARCH๋กœ ํ‰๊ฐ€๋˜๋ฉด, ๊ฐ€์žฅ ์ตœ๊ทผ์— ์ง„์ž…ํ–ˆ๋˜ __try ๋ธ”๋ก ์ค‘ __except ๋ธ”๋ก์„ ๊ฐ€์ง„ ๊ณณ์œผ๋กœ ์ด๋™ํ•˜์—ฌ ์˜ˆ์™ธ ํ•„ํ„ฐ๋ฅผ ํ‰๊ฐ€ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. __try ๋ธ”๋ก์ด __finally ๋ธ”๋ก์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฒ€์ƒ‰ ๋Œ€์ƒ์—์„œ ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ์™ธ๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋Š” ์ „์ฒด ํ๋ฆ„

์•ž์—์„œ ์–ธ๊ธ‰ํ•œ ๊ฐ ์˜ˆ์™ธ ํ•„ํ„ฐ์˜ ๋™์ž‘ ํ๋ฆ„์„ ํ•œ๋ˆˆ์— ์ •๋ฆฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์˜ˆ์™ธ๊ฐ€-์ฒ˜๋ฆฌ๋˜๋Š”-์ „์ฒด-ํ๋ฆ„
์˜ˆ์™ธ๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋Š” ์ „์ฒด ํ๋ฆ„

์ฐธ๊ณ 

Windows via C/C++ Fifth Edition, Jeffrey Richter

 

๋ฐ˜์‘ํ˜•