32-1-´Ù.ÇÔ¼ö¿Í ¿¹¿Ü ó¸®

¿¹¿Ü¸¦ ´øÁö´Â throw´Â º¸Åë try ºí·Ï ³»ºÎ¿¡ ÀÖ¾î¾ß ÇÑ´Ù. ±×·¯³ª ÇÔ¼ö ¾È¿¡¼­´Â try ºí·Ï¾øÀÌ throw¸¸ ÀÖÀ» ¼öµµ ÀÖ´Ù. À̶§´Â ÇÔ¼ö¸¦ È£ÃâÇϴ ȣÃâ¿øÀÌ try ºí·ÏÀ» °¡Á®¾ß ÇÑ´Ù. ´ÙÀ½ ¿¹Á¦´Â 0À¸·Î ³ª´©´Â ÇÔ¼ö divide¸¦ ÀÛ¼ºÇÏ°í ÀÌ ÇÔ¼ö¿¡¼­ Àμö·Î Àü´ÞµÈ d°¡ 0ÀÏ ¶§ throw·Î ¿¹¿Ü¸¦ ´øÁø´Ù. main¿¡¼­ 4¹ø throw¸¦ È£ÃâÇϴµ¥ °¢ °æ¿ì¿¡ ¾î¶»°Ô 󸮵ǴÂÁö º¸ÀÚ.

 

¿¹ Á¦ : throwfunc

#include <Turboc.h>

 

void divide(int a, int d)

{

     if (d == 0) throw "0À¸·Î´Â ³ª´­ ¼ö ¾ø½À´Ï´Ù.";

     printf("³ª´©±â °á°ú = %dÀÔ´Ï´Ù.\n",a/d);

}

 

void main()

{

     try {

          divide(10,0);

     }

     catch(const char *message) {

          puts(message);

     }

     divide(10,5);

//  divide(2,0);

/*

     try {

          divide(20,0);

     }

     catch(int code) {

          printf("%d¹ø ¿¡·¯°¡ ¹ß»ýÇß½À´Ï´Ù.\n",code);

     }

//*/

}

 

ÇÔ¼ö ½ÇÇàÁß¿¡ throw¸¦ ¸¸³ª¸é ´ëÀÀµÇ´Â catch¸¦ ã±â À§ÇØ ÀÚ½ÅÀ» È£ÃâÇÑ È£Ãâ¿øÀ» °Å½½·¯ ¿Ã¶ó°¡¾ß ÇÑ´Ù. ù ¹ø° divide È£Ãâ¹®¿¡¼­ ¿¹¿Ü°¡ ¹ß»ýÇϸé divide ÇÔ¼ö´Â ÀÚ½ÅÀ» È£ÃâÇÑ mainÀ¸·Î µ¹¾Æ¿Í¼­ ´ëÀÀµÇ´Â catch¹®À» ã¾Æ ÀÌ Äڵ带 ½ÇÇàÇÑ´Ù. catch´Â throw°¡ ´øÁø ¿¡·¯ ¸Þ½ÃÁö ¹®ÀÚ¿­À» È­¸éÀ¸·Î ±×´ë·Î Ãâ·ÂÇÒ °ÍÀÌ´Ù. ¸¸¾à main°ú divide »çÀÌ¿¡ ´Ù¸¥ ÇÔ¼öµéÀÌ ÀÖ´õ¶óµµ ¸¶Âù°¡Áö·Î main±îÁö º¹±ÍÇÑ ÈÄ ¿¹¿Ü°¡ 󸮵ȴÙ.

ÇÔ¼ö°¡ È£ÃâµÉ ¶§´Â ½ºÅÿ¡ °¢ ÇÔ¼öÀÇ ½ºÅà ÇÁ·¹ÀÓÀÌ »ý¼ºµÇ¸ç ½ºÅà ÇÁ·¹ÀÓ¿¡´Â ÇÔ¼ö ½ÇÇà¿¡ ÇÊ¿äÇÑ ¿©·¯ °¡Áö Á¤º¸µéÀÌ ÀúÀåµÈ´Ù. ÇÔ¼ö°¡ ¸®ÅÏÇÒ ¶§ ½ºÅà ÇÁ·¹ÀÓÀº Á¤È®ÇÏ°Ô È£Ãâ ÀüÀÇ »óÅ·Πµ¹¾Æ°¡µµ·Ï µÇ¾î ÀÖ´Ù. ¿¹¿Ü°¡ ¹ß»ýÇßÀ» ¶§ È£Ãâ¿øÀÇ catch·Î °ð¹Ù·Î Á¡ÇÁÇØ ¹ö¸®¸é ½ºÅÃÀÌ Ç×»ó¼ºÀ» ÀÒ¾î ¹ö¸®¹Ç·Î ÀÌÈÄ ÇÁ·Î±×·¥ÀÌ Á¦´ë·Î ½ÇÇàµÉ ¼ö ¾øÀ» °ÍÀÌ´Ù. ±×·¡¼­ throw´Â È£Ãâ¿øÀ¸·Î µ¹¾Æ°¡±â Àü¿¡ ÀڽŰú ÀÚ½ÅÀ» È£ÃâÇÑ ÇÔ¼öÀÇ ½ºÅÃÀ» ¸ðµÎ Á¤¸®ÇÏ°í µ¹¾Æ°¡´Âµ¥ À̸¦ ½ºÅà µÇ°¨±â(Stack Unwinding)¶ó°í ÇÑ´Ù.

ù ¹ø° divide È£Ãâ¹®ÀÌ ¿¹¿Ü¸¦ ´øÁú ¶§ mainÀÇ catch°¡ ÀÌ ¿¹¿Ü¸¦ ó¸®ÇÑ ÈÄ ±× ´ÙÀ½ ¹®ÀåÀ» ¾Æ¹« ÀÌ»ó¾øÀÌ ½ÇÇàÇÒ ¼ö ÀÖ´Â ÀÌÀ¯´Â throw°¡ ½ºÅà µÇ°¨±â¸¦ ÇÏ¿© mainÀÇ ½ºÅà ÇÁ·¹ÀÓÀ» divide È£Ãâ ÀüÀÇ »óÅ·Πº¹±¸Çϱ⠶§¹®ÀÌ´Ù. µÎ ¹ø° divide(10,5)´Â ¿Ã¹Ù¸¥ Àμö¸¦ Àü´ÞÇßÀ¸¹Ç·Î ¿¹¿Ü°¡ ¹ß»ýµÇÁö ¾ÊÀ¸¸ç È£Ãâ ÈÄ Á¤»óÀûÀÎ ÀýÂ÷´ë·Î ¸®ÅÏÇÑ´Ù.

¼¼ ¹ø° divide(2,0) È£ÃâÀº µÎ ¹ø° Àμö°¡ 0À̹ǷΠ¿¹¿Ü°¡ ¹ß»ýÇϴµ¥ À̶§ ÀÌ ¿¹¿Ü¸¦ ¹Þ¾ÆÁÙ catch¹®ÀÌ ¾ø´Ù. ÇÔ¼ö È£ÃâºÎ°¡ try ºí·Ï¿¡ ÀÖÁö ¾Ê±â ¶§¹®Àε¥ À̶§´Â ¿¹¿Ü¸¦ ó¸®ÇÒ ¼ö ¾øÀ¸¹Ç·Î µðÆúÆ® 󸮵Ǿî ÇÁ·Î±×·¥ÀÌ °­Á¦·Î Á¾·áµÈ´Ù. ¼³»ç try¾È¿¡ ÀÖ´õ¶óµµ ¿¹¿Ü¸¦ ¹Þ¾ÆÁÙ catch°¡ ¾øÀ¸¸é À̶§µµ 󸮵ÇÁö ¾Ê´Âµ¥ ³× ¹ø° È£Ãâ¹® divide(20,0)ÀÇ °æ¿ì try¾È¿¡ ÀÖ°í catchµµ ÀÖÁö¸¸ divide°¡ ´øÁö´Â char * ŸÀÔÀÇ catch´Â ¾øÀ¸¹Ç·Î ¿ª½Ã 󸮵ÇÁö ¾Ê°í ÇÁ·Î±×·¥Àº Á¾·áµÈ´Ù.

throw´Â ´ëÀÀµÇ´Â try ºí·ÏÀÇ catch¸¦ ã±â À§ÇØ ½ºÅÿ¡¼­ À§ÂÊ ÇÔ¼ö¸¦ ã¾Æ ¿Ã¶ó°¡¸é¼­ È£Ãâ ½ºÅÃÀ» Â÷·Ê´ë·Î Á¤¸®Çϴµ¥ À̶§ °¢ ÇÔ¼öµéÀÌ Áö¿ªÀûÀ¸·Î ¼±¾ðÇÑ °´Ã¼µéµµ Á¤»óÀûÀ¸·Î Æı«µÈ´Ù. ´ÙÀ½ ¿¹Á¦¸¦ ÅëÇØ ½ºÅÃÀ» µÇ°¨´Â ÀýÂ÷¸¦ ¿¬±¸ÇØ º¸ÀÚ.

 

¿¹ Á¦ : stackunwinding

#include <Turboc.h>

 

class C

{

     int a;

public:

     C() { puts("»ý¼ºÀÚ È£Ãâ"); }

     ~C() { puts("Æı«ÀÚ È£Ãâ"); }

};

 

void divide(int a, int d)

{

     if (d == 0) throw "0À¸·Î´Â ³ª´­ ¼ö ¾ø½À´Ï´Ù.";

     printf("³ª´©±â °á°ú = %dÀÔ´Ï´Ù.\n",a/d);

}

 

void calc(int t,const char *m)

{

     C c;

     divide(10,0);

}

 

void main()

{

     try {

          calc(1,"°è»ê");

     }

     catch(const char *message) {

          puts(message);

     }

     puts("ÇÁ·Î±×·¥ÀÌ Á¾·áµË´Ï´Ù.");

}

 

mainÀÇ try ºí·Ï¿¡¼­ calc¸¦ ºÎ¸£°í calc´Â Áö¿ª °´Ã¼ C¸¦ ¼±¾ðÇÑ´Ù. ±×¸®°í ¿¹¿Ü¸¦ ÀÏÀ¸Å°´Â divide(10,0)À» È£ÃâÇϴµ¥ ÀÌ ÇÔ¼ö¿¡¼­ throw¿¡ ÀÇÇØ ¹®ÀÚ¿­ ¿¹¿Ü°¡ ´øÁ®Áø´Ù. ÀÌ ¶§ÀÇ ½ºÅà »óȲÀº ´ÙÀ½°ú °°À» °ÍÀÌ´Ù.

divide¿¡¼­ ¿¹¿Ü°¡ ¹ß»ýÇßÀ¸¹Ç·Î ÀÌ ÇÔ¼ö´Â ´õ ÀÌ»ó ½ÇÇàÇÒ ¼ö ¾ø´Ù. ±×·¡¼­ ÀÌ ¿¹¿Ü¸¦ ó¸®ÇÒ catch¹®À» ã´Âµ¥ ÇÔ¼ö ³»ºÎ¿¡¼­´Â catch°¡ ¾øÀ¸¹Ç·Î ÀÏ´Ü ÀÚ½ÅÀ» È£ÃâÇÑ calc ÇÔ¼ö·Î µ¹¾Æ°£´Ù. ÀÌ °úÁ¤¿¡¼­ ÀÚ½ÅÀÇ ½ºÅà ÇÁ·¹ÀÓÀº Á¤¸®Çϴµ¥ ÀÌ·¸°Ô ÇÏÁö ¾ÊÀ¸¸é È£Ãâ¿øÀÌ ¿¹¿Ü¸¦ ó¸®ÇÏ´õ¶óµµ Á¦´ë·Î ½ÇÇàµÉ ¼ö ¾ø±â ¶§¹®ÀÌ´Ù.

calc¿¡¼­ ´Ù½Ã catch¸¦ ã´Âµ¥ ÀÌ ÇÔ¼öµµ catch¸¦ °¡Áö°í ÀÖÁö ¾ÊÀ¸¹Ç·Î °°Àº ¹æ½ÄÀ¸·Î ½ºÅÃÀ» Á¤¸®ÇÑ´Ù. À̶§ calcÀÇ Àμö t¿Í m, Áö¿ªº¯¼ö C°¡ Æı«µÇ´Âµ¥ C´Â °´Ã¼À̹ǷΠÁ¤»óÀûÀÎ Æı«¸¦ À§ÇØ Æı«ÀÚ°¡ È£ÃâµÈ´Ù. calc°¡ mainÀ¸·Î ¸®ÅÏÇϸé mainÀÇ catch(char *)·Î Á¡ÇÁÇÏ¿© ¿¹¿Ü¸¦ ó¸®ÇÑ´Ù. ½ºÅà µÇ°¨±â¸¦ Çϸ鼭 ¸®ÅϵǴ ÇÔ¼öÀÇ ¸ðµç Áö¿ª °´Ã¼¸¦ Æı«Çϴµ¥ ¸¸¾à Æı«ÀÚ¸¦ È£ÃâÇÏÁö ¾Ê´Â´Ù¸é ¿¹¿Ü¸¸ ó¸®µÉ »Ó »ý¼ºµÈ °´Ã¼µéÀÌ Á¦´ë·Î ÇØÁ¦µÇÁö ¾Ê¾Æ ÇÁ·Î±×·¥ÀÇ »óÅ´ ¿©ÀüÈ÷ ºÒ¾ÈÇØÁú °ÍÀÌ´Ù. Æı«ÀÚ´Â ´Ü¼øÈ÷ ¸Þ¸ð¸®¸¸ Á¤¸®ÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó ¶§·Î´Â DB ¿¬°á ÇØÁ¦, ÇÁ·Î±×·¥ »óÅ º¯°æ µîÀÇ Áß¿äÇÑ ÀÏÀ» ÇÒ ¼öµµ ÀÖÀ¸¹Ç·Î ¹Ýµå½Ã È£ÃâÇØ¾ß ÇÑ´Ù.

throw°¡ ´ëÀÀµÇ´Â catch¸¦ ã±â À§ÇØ ½ºÅà µÇ°¨±â¸¦ ÇØ¾ß ÇÏ´Â ÀÌÀ¯´Â ¾ÆÁÖ ¸í¹éÇÏ´Ù. throw´Â catch·ÎÀÇ Á¡ÇÁ µ¿ÀÛÀ» Çϴµ¥ ÇÔ¼ö°£¿¡ ¾Æ¹«·¸°Ô³ª Á¡ÇÁ¸¦ ÇØ ¹ö¸®¸é ½ºÅÃÀÇ È£Ãâ Á¤º¸´Â ¾û¸ÁÀÌ µÇ¾î ¹ö¸°´Ù. È£Ãâ¿øÀ¸·Î µ¹¾Æ°¥ ¶§´Â ½ºÅõµ È£Ãâ¿øÀÇ °ÍÀ¸·Î Á¤È®ÇÏ°Ô º¹±¸ÇØ¾ß ÇÏ¸ç ±×·¯±â À§Çؼ­´Â ÀÚ½ÅÀ» È£ÃâÇÑ ¸ðµç ÇÔ¼öÀÇ ½ºÅÃÀ» ÀÏÀÏÀÌ Á¤¸®ÇØ¾ß ÇÏ´Â °ÍÀÌ´Ù. À§ ¿¹¿¡¼­ mainÀÇ ¸¶Áö¸·¿¡ ÀÖ´Â puts°¡ Á¦´ë·Î ½ÇÇàµÇ·Á¸é catch°¡ ¿¹¿Ü¸¦ ó¸®ÇÑ ÈÄ ½ºÅÃÀÇ ÃÖ»ó´Ü¿¡´Â mainÀÇ ½ºÅà ÇÁ·¹ÀÓÀÌ ÀÖ¾î¾ß ÇÏ¸ç ±×·¯±â À§Çؼ­´Â divideÀÇ throw°¡ divide¿Í calcÀÇ ½ºÅÃÀ» Á¤¸®ÇØ¾ß ÇÏ´Â °ÍÀÌ´Ù.