¡Ô ÇÁ·Î±×·¡¹Ö ¼ÒÇ° ¹× ÆÁ

 ¡å Assertion catchÇϱâ

C++

N/A

¿ÜºÎ ¶óÀ̺귯¸®°¡ release ¸ðµå·Î µÈ °ÍÀÌ ¾Æ´Ï¶ó¼­ ¿¹»óÄ¡ ¸øÇÑ assertionÀ» ¸¸³ª´Â °æ¿ì°¡ ÀÖ´Ù. ±×·¸´Ù°í ¿ÜºÎ ¶óÀ̺귯¸®ÀÇ ¼Ò½º¸¦ ÀçÄÄÆÄÀÏ ÇÒ¼ö ÀÖ´Â »óȲÀÌ ¾Æ´Ï¶ó¸é »çÅ´ ´õ¿í ½É°¢ÇØÁø´Ù. VC++À̶ó¸é Ç¥ÁØ C++ Çü½ÄÀÌ ¾Æ´Ñ ÀÚüÀûÀÎ ¿¹¿Ü ó¸® ±â¹ýÀ» ÀÌ¿ëÇØ ÇØ°áÇÒ ¼ö ÀÖ°ÚÁö¸¸ ±× Äڵ尡 VC++»Ó¸¸ ¾Æ´Ï¶ó ´Ù¸¥ Ç÷§Æû¿¡¼­µµ ±¸µ¿µÇ¾î¾ß ÇÏ´Â °ÍÀ̶ó¸é Ç¥ÁØ C++ ¹®¹ý ÀÌ¿Ü¿¡´Â »ç¿ëÇؼ­´Â ¾ÈµÈ´Ù.

½ÇÁ¦·Î ÀÌ·± ÀÏÀ» ¸¸³ª°Ô µÇ¾ú°í ±×¶§ ³»°¡ ÀÛ¼ºÇÑ ÄÚµå´Â ´ÙÀ½°ú °°´Ù.

    01: ///////////////////////////////////////////////////////
    02: // HEADER
    03:
    04: #include <csetjmp>
    05: #include <csignal>
    06: #include <cassert>
    07: #include <cstdio>
    08:
    09: #define ASSERT_TRY if (setjmp(g_env) == 0)
    10: #define ASSERT_CATCH else
    11: #define USE_ASSERT_TRY signal(SIGABRT, AbortHandler);
    12:
    13: ///////////////////////////////////////////////////////
    14: // IMPLEMENTAION
    15:
    16: jmp_buf g_env;
    17:
    18: #if defined(WIN32)
    19: #define CDECL __cdecl
    20: #else
    21: #define CDECL
    22: #endif
    23:
    24: void CDECL AbortHandler(int num)
    25: {
    26:     USE_ASSERT_TRY
    27:     longjmp(g_env, 1);
    28: }
    29:
    30: ///////////////////////////////////////////////////////
    31: // TEST CASE
    32:
    33: int TestFunction(int data)
    34: {
    35:     assert(data != 50);
    36:     return data;
    37: }
    38:
    39: void AssertionTest(void)
    40: {
    41:     int sum = 0;
    42:
    43:     for (int i = 1; i <= 100; i++)
    44:     {
    45:         ASSERT_TRY
    46:         {
    47:             sum += TestFunction(i);
    48:         }
    49:         ASSERT_CATCH
    50:         {
    51:             printf("i = %dÀÏ ¶§ assertion ¹ß»ý\n", i);
    52:         }
    53:     }
    54:
    55:     printf("\nsum = %d\n", sum);
    56: }
    57:
    58: int main(void)
    59: {
    60:     USE_ASSERT_TRY
    61:
    62:     AssertionTest();
    63:
    64:     return 0;
    65: }

½ÇÁ¦·Î »ç¿ëµÇ´Â °ÍÀº ASSERT_TRY, ASSERT_CATCH, USE_ASSERT_TRYÀÇ 3°³ÀÇ ¸ÅÅ©·ÎÀÌ´Ù.

USE_ASSERT_TRY:
assertion catch ±â´ÉÀ» »ç¿ëÇÏ°Ú´Ù´Â ¼±¾ðÀÌ´Ù. ¸¸¾à ÀÌ°ÍÀÌ ¼±¾ðµÇÁö ¾Ê´Â´Ù¸é °ü·Ã ¸ÅÅ©·Î´Â ¸ðµÎ ¹«½ÃµÈ´Ù. ÀÌ°ÍÀ» ¼±¾ðÇÏ´Â ½ÃÁ¡ ÀÌÈķθ¸ °ü·Ã ¸ÅÅ©·Î°¡ È°¼ºÈ­µÈ´Ù.

ASSERT_TRY:
ÀϹÝÀûÀ¸·Î »ç¿ëµÇ´Â try - catch ±¸¹®ÀÇ try¿Í µ¿ÀÏÇÑ ¿ë¹ýÀÌ´Ù. ÀÌ ³»ºÎ¿¡¼­ assertionÀÌ ÀϾÀ» ¶§ catch ±¸¹®À¸·Î Á¡ÇÁÇÑ´Ù.

ASSERT_CATCH:
ÀϹÝÀûÀÎ try - catch ±¸¹®¿¡¼­ catch¿¡ ÇØ´çÇÑ´Ù. ´ÜÁö error handlingÀ» À§ÇÑ class¸¦ ¹Þ´Â ºÎºÐÀº ºüÁ® Àִµ¥ ±×°ÍÀÌ ÇÊ¿äÇÏ´Ù¸é Ãß°¡ÇÏ¸é µÈ´Ù. (ÇÏÁö¸¸ ´ÙÁß ÆĶó¹ÌÅÍ¿¡ ´ëÇÑ catch°¡ µÉ·±Áö´Â Àǹ®)

»ç½Ç ³»¿ëÀº ÀüÇô C++ÀÌ ¾Æ´Ï°í C¿¡¼­ »ç¿ëµÈ error handling ±â¹ýÀ» »ç¿ëÇÏ¿´´Ù. (VC++ÀÇ µð¹ö±× ¸ðµå¿¡¼­ Å×½ºÆ® Çϸé, assert¿¡ ´ëÇÑ °ÍÀ» Áß°£¿¡ IDE°¡ ¸ÕÀú °¨Áö¸¦ Çϴµ¥ ±×¶© '¹«½Ã'¸¦ ´­·¯ ÁÖ¸é µÈ´Ù.)