32-3.¿¹¿Ü ÁöÁ¤

32-3-°¡.¹Ìó¸® ¿¹¿Ü

throw°¡ ¿¹¿Ü¸¦ ´øÁ³´Âµ¥ ÀÌ ¿¹¿Ü¸¦ ¹Þ¾ÆÁÙ catch°¡ ¾ø´Â °æ¿ì´Â ¾Æ¹«µµ ÀÌ ¿¹¿Ü¸¦ ó¸®ÇÏÁö ¾Ê´Â´Ù. ¼³»ç try ºí·Ï¿¡ throw°¡ Æ÷ÇԵǾî ÀÖ°í catch ºí·ÏÀÌ ÀÖ´õ¶óµµ ´øÁø ¿¹¿Ü¿Í ŸÀÔÀÌ ¸Â´Â catch°¡ ¾ø´Ù¸é ÀÌ ¿¹¿Üµµ ¹Ìó¸® ¿¹¿Ü°¡ µÈ´Ù. ¹Ìó¸® ¿¹¿Ü´Â terminate¶ó´Â ÇÔ¼ö°¡ ó¸®Çϴµ¥ ÀÌ ÇÔ¼ö´Â ±âº»ÀûÀ¸·Î abort¸¦ È£ÃâÇÏ¿© ÇÁ·Î±×·¥À» °­Á¦·Î Á¾·áÇÑ´Ù. ³ªÁß¿¡ ¸»½éÀ» ºÎ¸± ¹Ù¿¡¾ß °³¹ßÁß¿¡ Á¾·áµÇ¾î ¿¹¿Ü¸¦ ºÐ¸íÈ÷ ¾Ë¸®´Â °ÍÀÌ ´õ ÁÁ´Ù´Â ½ÄÀε¥ °í°´¾Õ¿¡¼­ Á×À» ¹Ù¿¡¾ß Áö±Ý ´çÀå Á×¾î¶ó´Â ¶æÀÌ´Ù. ±×·¡¼­ ¿¹¿Ü 󸮸¦ À߸øÇϸé ÇÁ·Î±×·¥Àº Á¤¸® ÀÛ¾÷µµ ÇÏÁö ¸øÇÏ°í °­Á¦ Á¾·áµÈ´Ù.

¸¸¾à ¹Ìó¸® ¿¹¿Ü¸¦ Ưº°ÇÑ ¹æ½ÄÀ¸·Î ó¸®ÇÏ°í ½Í´Ù¸é ¹Ìó¸® ¿¹¿ÜÀÇ Çڵ鷯¸¦ µû·Î µî·ÏÇÒ ¼ö ÀÖ´Ù. À̶§´Â exception Çì´õ ÆÄÀÏ¿¡ ¼±¾ðµÇ¾î ÀÖ´Â ´ÙÀ½ ÇÔ¼ö¸¦ »ç¿ëÇϴµ¥ Àμö·Î void func(void) ŸÀÔ(terminate_handler)ÀÇ ÇÔ¼ö Æ÷ÀÎÅ͸¦ Àü´ÞÇÑ´Ù. ÀÌÈÄ ¹Ìó¸® ¿¹¿Ü°¡ ¹ß»ýÇÒ °æ¿ì ÁöÁ¤ÇÑ Çڵ鷯 ÇÔ¼ö°¡ È£ÃâµÈ´Ù.

 

terminate_handler set_terminate(terminate_handler ph)

 

¹Ìó¸® ¿¹¿Ü Çڵ鷯´Â ¾Æ¹«µµ ó¸®ÇÏÁö ¾Ê´Â ¿¹¿Ü°¡ ¹ß»ýÇßÀ» ¶§ÀÇ ±Ø´ÜÀûÀÎ ¿¹¿Ü¸¦ ó¸®ÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½ ¿¹Á¦´Â mytermÀ̶ó´Â ÇÔ¼ö¸¦ ¹Ìó¸® ¿¹¿Ü Çڵ鷯·Î µî·ÏÇÏ¿© ¸Þ½ÃÁö¸¦ È­¸é¿¡ Ãâ·ÂÇÑ ÈÄ Á¾·áÇÑ´Ù.

 

¿¹ Á¦ : terminate

#include <Turboc.h>

#include <exception>

using namespace std;

 

void myterm()

{

     puts("󸮵ÇÁö ¾ÊÀº ¿¹¿Ü ¹ß»ý");

     exit(-1);

}

 

void main()

{

     set_terminate(myterm);

     try {

          throw 1;

     }

     catch(char *m) {

     }

}

 

main¿¡¼­ Á¤¼öÇüÀÇ ¿¹¿Ü¸¦ ´øÁ³´Âµ¥ µÚÂÊÀÇ catch¿¡´Â Á¤¼öÇüÀ» ¹Þ´Â ºÎºÐÀÌ ¾øÀ¸¹Ç·Î ÀÌ ¿¹¿Ü´Â ¹Ìó¸® ¿¹¿ÜÀÌ´Ù. µû¶ó¼­ ¹Ì¸® ÁöÁ¤ÇÑ myterm ÇÔ¼ö°¡ È£ÃâµÈ´Ù. À̶§ ¿¹¿Ü¸¦ ¹ß»ý½ÃŲ ÇÔ¼öÀÇ ½ºÅÃÀ» Á¤¸®ÇÒ °ÍÀΰ¡ ¾Æ´Ñ°¡´Â ÄÄÆÄÀÏ·¯¿¡ µû¶ó ´Ù¸£´Ù.

ÀÓÀÇÀÇ °´Ã¼¸¦ ¹ÞÀ¸·Á¸é catch (...)À» »ç¿ëÇϴµ¥ À̶§ ...Àº ¾ÕºÎºÐÀÇ catch¿¡¼­ 󸮵ÇÁö ¾ÊÀº ¸ðµç ¿¹¿Ü¸¦ ÀǹÌÇÑ´Ù. catch (...)Àº ¿¹¿Ü°¡ ¹ß»ýÇß´Ù´Â °Í¸¸ ¾Ë ¼ö ÀÖÀ¸¸ç ¾î¶² ¿¹¿Ü°¡ ¿Ö ¹ß»ýÇß´ÂÁö´Â ¾ËÁö ¸øÇÏ´Â ÇÑ°è°¡ ÀÖ´Ù. ±×·¡¼­ ÀÌ ±¸¹®Àº Àß »ç¿ëµÇÁö ¾Ê´Â´Ù. °³¹ßÁß¿¡ ¿¹¿Ü »ç½ÇÀ» ´Ü¼øÈ÷ ¾Ë°í¸¸ ½ÍÀ» ¶§, ¿¹¿Ü ¹ß»ý »ç½Ç¸¸ Áß¿äÇÏ°í Á¤º¸´Â ÇÊ¿ä¾øÀ» ¶§ catch (...)À» »ç¿ëÇÑ´Ù. terminate´Â Àü¿ªÀûÀÎ ¹Ìó¸® Çڵ鷯Àε¥ ºñÇØ catch (...)Àº ±¹ÁöÀûÀÎ ¹Ìó¸® ¿¹¿Ü Çڵ鷯¶ó°í ÇÒ ¼ö ÀÖ´Ù.

 

catch (...) {

     puts("¹ºÁö ¸ð¸£°Ú´Âµ¥ ÇÏ¿¸µç À߸øµÇ¾ú½À´Ï´Ù.");

}

 

throw¿¡ ÀÇÇØ ¿¹¿Ü°¡ ´øÁ®Áú ¶§ ÄÄÆÄÀÏ·¯´Â try ºí·Ï ¹Ù·Î ¹ØÀÇ catch¸¦ µîÀåÇÏ´Â ¼ø¼­´ë·Î Á¡°ËÇÏ¿© ¿¹¿ÜÀÇ Å¸ÀÔ°ú ÀÏÄ¡ÇÏ´Â catch¸¦ ã´Â´Ù. ±×·±µ¥ catch (...)Àº ÀÓÀÇÀÇ ¿¹¿Ü ŸÀÔÀ» ¸ðµÎ ¹ÞÀ» ¼ö ÀÖÀ¸¹Ç·Î ÀÌ ±¸¹®ÀÌ Á¦ÀÏ ¾Õ¿¡ ÀÖ´Ù¸é µÚÂÊÀÇ catch´Â Àý´ë·Î È£ÃâµÇÁö ¾ÊÀ» °ÍÀÌ´Ù. ±×·¡¼­ catch (...)Àº ¹Ýµå½Ã ¸ðµç catchÀÇ ³¡¿¡ ¿Í¾ß ÇÑ´Ù. ¿©·¯ °³ÀÇ catch°¡ ÀÖÀ» °æ¿ì ¿Ã¹Ù¸¥ ¹èÄ¡´Â ¿ÞÂÊÀÌ´Ù.

 

try { }

catch (int)

catch (char *)

catch (exception)

catch (...)

try { }

catch (...)

catch (int)

catch (char *)

catch (exception)

 

¿À¸¥ÂÊ°ú °°ÀÌ catch (...)ÀÌ Á¦ÀÏ ¾Õ¿¡ ÀÖÀ¸¸é ¸ðµç ¿¹¿Ü¸¦ ÀÌ catch°¡ ¹Þ¾Æ¼­ ó¸®ÇÒ °ÍÀ̹ǷΠ¾Æ·¡ÂÊÀÇ catch´Â ÀÖÀ¸³ª ¸¶³ªÇÑ Á¸Àç°¡ µÈ´Ù. ¼ø¼­´ë·Î Á¡°ËÇϱ⠶§¹®¿¡ Æ÷°ýÀûÀÎ ¹üÀ§ÀÇ ¿¹¿Ü °´Ã¼ Çڵ鷯°¡ °¡±ÞÀûÀÌ¸é µÚ¿¡ ÀÖ¾î¾ß ÇÑ´Ù. ºÎ¸ð Ŭ·¡½º ŸÀÔ, ÀÚ½Ä Å¬·¡½º ŸÀÔÀ» ¹Þ´Â Çڵ鷯°¡ µÑ ÀÖ´Ù¸é ÀÚ½ÄÀ» ó¸®ÇÏ´Â Çڵ鷯°¡ ¸ÕÀú ³ª¿À°í ºÎ¸ð¸¦ ó¸®ÇÏ´Â Çڵ鷯°¡ µÚ¿¡ ³ª¿Í¾ß ÇÑ´Ù.

ÄÄÆÄÀÏ·¯°¡ ´øÁ®Áø ¿¹¿Ü °´Ã¼·ÎºÎÅÍ Çڵ鷯¸¦ ãÀ» ¶§ ¿¹¿Ü °´Ã¼ÀÇ Å¸ÀÔ Á¡°ËÀº Áö³ªÄ¥ Á¤µµ·Î ¾ö°ÝÇÏ´Ù. ÄÄÆÄÀÏ·¯ÀÇ ¾Ï½ÃÀûÀΠŸÀÔ º¯È¯Àº µ¿ÀÛÇÏÁö ¾ÊÀ¸¹Ç·Î ¹Ýµå½Ã Á¤È®ÇÑ Å¸ÀÔÀÇ catch¸¸ ¼±ÅõȴÙ. ´ÙÀ½ Äڵ带 º¸¸é ¿¹¿Ü 󸮰¡ Àß µÉ °Í °°Áö¸¸ ½ÇÁ¦·Î ½ÇÇàÇØ º¸¸é ¹Ìó¸® ¿¹¿Ü°¡ µÈ´Ù.

 

try {

     if (TRUE) throw 1234;

}

catch(unsigned a) {

     printf("%d¿¡ ´ëÇÑ ¿¹¿Ü ¹ß»ý\n",a);

}

 

¿Ö³ÄÇϸé 1234´Â intÇü »ó¼öÀε¥ catch´Â unsigned¸¸ ¹ÞÀ¸¹Ç·Î ¿¹¿Ü °´Ã¼ÀÇ Å¸ÀÔÀÌ ¸ÂÁö ¾ÊÀº °ÍÀÌ´Ù. throw 1234u¶ó°í Ç¥±âÇÏ¿© ŸÀÔÀ» ¸ÂÃ߸é catch(unsigned)¿Í Á¤È®ÇÏ°Ô ´ëÀÀµÉ °ÍÀÌ´Ù. ´ëÀÔÀ̳ª ÇÔ¼ö È£Ãâ°°Àº °æ¿ì¶ó¸é ÄÄÆÄÀÏ·¯°¡ Àû´çÈ÷ ŸÀÔÀ» º¯È¯ÇÏÁö¸¸ ¿¹¿Ü °´Ã¼´Â Á¤È®ÇÑ Å¸ÀÔ¸¸ ã´Â´Ù.

½ÉÁö¾î int¿Í short °°ÀÌ ±æÀ̸¸ ´Ù¸¥ ŸÀÔÀ̳ª int¿Í longó·³ ÀáÀçÀûÀ¸·Î´Â ´Ù¸¦ ¼ö ÀÖ´õ¶óµµ ½ÇÁ¦·Î´Â °°Àº ŸÀÔÁ¶Â÷µµ ´Ù¸¥ ¿¹¿Ü °´Ã¼·Î ÀνĵȴÙ. ´Ü, ¿¹¿ÜÀûÀ¸·Î void * ŸÀÔÀ» ¹Þ´Â Çڵ鷯´Â ÀÓÀÇÀÇ Æ÷ÀÎÅÍ Å¸ÀÔ °´Ã¼¸¦ ¹ÞÀ» ¼ö ÀÖ°í ºÎ¸ð Æ÷ÀÎÅÍ Å¸ÀÔÀ» ¹Þ´Â Çڵ鷯´Â ÀÚ½Ä °´Ã¼¸¦ ¹ÞÀ» ¼ö ÀÖ´Ù.