๊ตฌ์กฐ์ ์์ธ ์ฒ๋ฆฌ(SEH, Structured Exception Handling) ๊ธฐ์ด ์ด์ผ๊ธฐ
๊ตฌ์กฐ์ ์์ธ ์ฒ๋ฆฌ(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
'Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[C++] C++์์ ๊ตฌ์กฐ์ ์์ธ ์ฒ๋ฆฌ(SEH) ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
[C++] C++์์ ๊ตฌ์กฐ์ ์์ธ ์ฒ๋ฆฌ(SEH) ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
2022.10.18 -
ํ๋ก๊ทธ๋จ์์ ์ผ๋ฐ์ ์ธ ์์ธ ์ฒ๋ฆฌ(Exception Handling)ํ๋ ๋ฐฉ๋ฒ
ํ๋ก๊ทธ๋จ์์ ์ผ๋ฐ์ ์ธ ์์ธ ์ฒ๋ฆฌ(Exception Handling)ํ๋ ๋ฐฉ๋ฒ
2022.10.15 -
์์ธ ์คํ ํ๊ธฐ(Stack Unwinding)์ ํ๋ก๊ทธ๋จ ์ฑ๋ฅ ์ํฅ
์์ธ ์คํ ํ๊ธฐ(Stack Unwinding)์ ํ๋ก๊ทธ๋จ ์ฑ๋ฅ ์ํฅ
2022.10.12
๋๊ธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.