[C++] C++์์ ๊ตฌ์กฐ์ ์์ธ ์ฒ๋ฆฌ(SEH) ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
๊ตฌ์กฐ์ ์์ธ ์ฒ๋ฆฌ์ C++ ์์ธ ์ฒ๋ฆฌ
๊ตฌ์กฐ์ ์์ธ ์ฒ๋ฆฌ๋ Microsoft Windows์ ๊ธฐ๋ณธ ์์ธ ์ฒ๋ฆฌ ๋ฉ์ปค๋์ฆ์ด๋ฉฐ, ์ํํธ์จ์ด์ ํ๋์จ์ด ์์ธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค๊ณ ์ค๋ช ํ์์ต๋๋ค. ์ด๋ฌํ ๋ด์ฉ์ ์๋ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ์ธ์.
๊ตฌ์กฐ์ ์์ธ ์ฒ๋ฆฌ(SEH, Structured Exception Handling) ๊ธฐ์ด ์ด์ผ๊ธฐ
๊ทธ๋ฆฌ๊ณ C++ ์์ธ ๋ฌธ๋ฒ์ธ try
, catch
, throw
๋ ๋ด๋ถ์ ์ผ๋ก ๊ตฌ์กฐ์ ์์ธ ์ฒ๋ฆฌ(์ดํ SEH, Structured Exception Handling) ๊ธฐ๋ฅ์ ์ด์ฉํ์ฌ ๊ตฌํ๋์ด ์๋ค๋ ๋ด์ฉ๋ ์ธ๊ธํ์ต๋๋ค. ์ด์จ๋ , ํน๋ณํ ์ด์ ๊ฐ ์๋ค๋ฉด C++ ์ธ์ด์์๋ C++ ์์ธ ์ฒ๋ฆฌ ๋ฌธ๋ฒ์, C#์์๋ C# ์์ธ ์ฒ๋ฆฌ ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
๋ณธ๋ฌธ์์๋ C++ ์ธ์ด์์ SEH๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
C++์์ SEH ์ฌ์ฉํ๊ธฐ
๊ฐ๋จํ ํ ์คํธ๋ฅผ ์ํด Visual Studio 2019์์ ์ฝ์ ์ฑ ํ๋ก์ ํธ๋ฅผ ์์ฑํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์๋ ๋งํฌ์ ๊ธฐ๋ณธ ์์ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ์ฌ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
https://learn.microsoft.com/ko-kr/cpp/cpp/structured-exception-handling-c-cpp?view=msvc-170
์์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
#include <stdio.h>
#include <Windows.h>
#include <exception>
class TestClass
{
public:
~TestClass()
{
printf("Destroying TestClass!\r\n");
}
};
__declspec(noinline) void TestCPPEX()
{
#ifdef CPPEX
printf("Throwing C++ exception\r\n");
throw std::exception("");
#else
printf("Triggering SEH exception\r\n");
volatile int *pInt = 0x00000000;
*pInt = 20;
#endif
}
__declspec(noinline) void TestExceptions()
{
TestClass d;
TestCPPEX();
}
int main()
{
__try
{
TestExceptions();
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
printf("Executing SEH __except block\r\n");
}
return 0;
}
ํด๋น ์์ ์ฝ๋๋ฅผ ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ํ์๋ฉ๋๋ค.
Triggering SEH exception //24๋ฒ ์งธ
Executing SEH __except block //44๋ฒ ์งธ
ํ๋ก๊ทธ๋จ์ ์คํํ๋ฉด CPPEX
๊ฐ ์ ์๋์ด ์์ง ์์ 24๋ฒ์งธ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋๊ณ , ์๋ชป๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ์ ๊ทผ์ ์๋ํ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ __except
ํํฐ์ ์ํด 44๋ฒ์งธ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋๋ ๋์์
๋๋ค. ์ฌ๊ธฐ์, TestClass ๊ฐ์ฒด์ ์๋ฉธ์๊ฐ ์ ์๋์ด ์๋๋ฐ ํธ์ถ๋์ง ์์ ๊ฒ์ ์ ์ ์์ต๋๋ค.
๋ง์ฝ, ํ๋ก์ ํธ ์์ฑ์ ๋ช
๋ น์ค์ /DCPPEX
๋ฅผ ์ถ๊ฐํ๋ฉด ๊ฒฐ๊ณผ๋ ๋ฌ๋ผ์ง๋๋ค.
์๋์ ๊ฐ์ด 14๋ฒ์งธ ์ค์ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
Throwing C++ exception
Destroying TestClass! //14๋ฒ ์งธ
Executing SEH __except block
/DCPPEX
๋ช
๋ น์ค์ ์ถ๊ฐํ๋ฉด CPPEX
๊ฐ ์ ์๋์ด C++ ์์ธ์ธ throw๊ฐ ํธ์ถ๋๋ฉด์ ์๋ฉธ์๊ฐ ํธ์ถ๋๊ธฐ ๋๋ฌธ์
๋๋ค.
๋ง์ง๋ง์ผ๋ก, C++ ์์ธ์ SEH๋ฅผ ๊ฐ์ด ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด C++ ์์ธ ์ฒ๋ฆฌ ๊ฐ๋ฅ ์ต์
์ /EHa
๋ก ๋ณ๊ฒฝํ๋ฉด ๋ฉ๋๋ค.
์ด๋ ๊ฒ ์ต์
์ ๋ณ๊ฒฝํ๋ฉด ๋ช
๋ น์ค์ /DCPPEX
๊ฐ ์๋ ์๋ ์๊ด์์ด, ์๋ฉธ์๊ฐ ์ ์์ ์ผ๋ก ํธ์ถ๋ฉ๋๋ค.
Throwing C++ exception
Destroying TestClass! //14๋ฒ ์งธ
Executing SEH __except block
'Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
ํ๋ก๊ทธ๋จ์์ ์ผ๋ฐ์ ์ธ ์์ธ ์ฒ๋ฆฌ(Exception Handling)ํ๋ ๋ฐฉ๋ฒ
ํ๋ก๊ทธ๋จ์์ ์ผ๋ฐ์ ์ธ ์์ธ ์ฒ๋ฆฌ(Exception Handling)ํ๋ ๋ฐฉ๋ฒ
2022.10.15 -
์์ธ ์คํ ํ๊ธฐ(Stack Unwinding)์ ํ๋ก๊ทธ๋จ ์ฑ๋ฅ ์ํฅ
์์ธ ์คํ ํ๊ธฐ(Stack Unwinding)์ ํ๋ก๊ทธ๋จ ์ฑ๋ฅ ์ํฅ
2022.10.12 -
๊ตฌ์กฐ์ ์์ธ ์ฒ๋ฆฌ(SEH, Structured Exception Handling) ๊ธฐ์ด ์ด์ผ๊ธฐ
๊ตฌ์กฐ์ ์์ธ ์ฒ๋ฆฌ(SEH, Structured Exception Handling) ๊ธฐ์ด ์ด์ผ๊ธฐ
2022.08.28