¿ì¸®´Â ¹«¾ùÀ» ´Ù·ê °ÍÀΰ¡? |
---|
|
ÀüÅëÀûÀ¸·Î ÇÁ·Î±×·¡¸Ó°¡ ÀÛ¾÷À» ÇÒ¶§´Â, ¿¹¸¦ µé¾î ÇÔ¼ö¸¦ È£ÃâÇÒ¶§´Â, ÇÔ¼öÀÇ °á°ú´Â À¯È¿¼ºÀ» °ËÁõ¹ÞÀ» ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î ¿©·¯ºÐÀÌ Á¸ÀçÇÏÁö ¾Ê´Â ÆÄÀÏÀ» ¿·Á°í ÇÑ´Ù¸é ¹Ýȯ°ªÀº NULL °ªÀÌ µÉ °ÍÀÌ´Ù. ÀÌ·¯ÇÑ Á¾·ùÀÇ »óȲÀ» ´Ù·ç´Â µ¥´Â µÎ °³ÀÇ ÀϹÝÀûÀÎ Àü·«ÀÌ ÀÖ´Ù:
¾î¶² °æ¿ì¿¡³ª ¿¡·¯°¡ ÀϾ´ÂÁö ¾Ë¾Æº¸°Å³ª ÀûÀýÇÑ Á¶Ä¡¸¦ ÃëÇÏ´Â °ÍÀº ÇÁ·Î±×·¡¸ÓÀÇ Ã¥ÀÓÀÌ´Ù.
BASIC¿¡¼ ÀÌ°ÍÀº ´ÙÀ½°ú °°ÀÌ º¸ÀδÙ:
OPEN "A:\DATA.TXT" FOR INPUT AS #1 IF ERR = 53 THEN CALL FileNotFoundError ELSE REM CONTINUE WITH FILE HANDLING HERE END IF
ÀÌ°ÍÀº ÁúÁÁÀº ÇÁ·Î±×·¥À» »ý»êÇÑ °á°ú°¡ µÉ ¼öµµ Àִµ¥ ÄÚµåÀÇ Àý¹ÝÀÌ»óÀÌ ¸ðµç ÀÛµ¿µéÀÌ ¼º°øÇß´ÂÁö Á¡°ËÇϴµ¥ Á¡À¯µÈ´Ù. ÀÌ°ÍÀº ¼º°¡½Ã¸ç ±× Äڵ带 Àб⿡ ¾î·Æ°Ô ¸¸µç´Ù (±×·¯³ª ½ÇÁ¦·Î ±×°ÍÀº ´ë´Ù¼öÀÇ ÇÁ·Î±×·¥µéÀÌ ¿À´Ã³¯ ÀÛµ¿ÇÏ´Â ¹æ½ÄÀÌ´Ù.) ¸»µµ ¾ÈµÇ´Â ½Ç¼ö¸¦ ÇÇÇÏ°íÀÚ ÇÑ´Ù¸é ÀÏ°üÀûÀÎ Á¢±Ù¹ýÀº ÇʼöÀûÀÌ´Ù.
´õ¿í ¸¹Àº ÃÖ±ÙÀÇ ÇÁ·Î±×·¡¹Ö ȯ°æ¿¡¼ ¿¡·¯¸¦ ´Ù·ç´Â ´ë¾ÈÀûÀÎ ¹æ¹ýÀÌ °³¹ß µÇ¾ú´Ù. ÀÌ°ÍÀº ¿¹¿Üó¸® ¶ó°í ºÒ¸®´Â °ÍÀ¸·Î ¿¡·¯¸¦ ¹ö¸®°Å³ª( throw) ȤÀº µé¾î¿Ã¸®°Å³ª(raise) ÇÔÀ¸·Î½á ÀÛµ¿ÇÑ´Ù. ±×·¯¸é ½Ã½ºÅÛÀº ÇöÀçÀÇ ÄÚµå ºí·ÏÀ» Å»ÃâÇÏ¿© °¡Àå °¡±î¿î ¿¹¿Üó¸® ºí·ÏÀ¸·Î °Á¦ÀûÀ¸·Î Á¡ÇÁÇÑ´Ù. ½Ã½ºÅÛÀº ¸ðµç ¿¹¿Ü»óȲÀ» ³ªÆ÷ÇÏ´Â catches ±âº» 󸮱⸦ Á¦°øÇÏ¸ç º¸Åë ¿¡·¯¸Þ½ÃÁö¸¦ Ãâ·ÂÇÏ°í Á¾·áÇÑ´Ù.
¿¹¿Üó¸® ºí·ÏÀº ¾à°£Àº if...then...else ºí·Ï°ú ºñ½ÁÇÏ°Ô ÄÚµùµÈ´Ù:
try: # program logic goes here except ExceptionType: # exception processing for named exception goes here except AnotherType: # exception processing for a different exception goes here else: # here we tidy up if NO exceptions are raised
¿ì¸®°¡ ¿¡·¯¹ß»ý ÈÄ¿¡ ¸»²ûÇÏ°Ô Á¤¸®ÇÒ ¼ö ÀÖµµ·Ï ÇØÁÖ´Â ¶Ç ´Ù¸¥ ÇüÅÂÀÇ '¿¹¿Ü' ºí·ÏÀÌ ÀÖµð. ±×°ÍÀ» try...finally ºí·ÏÀ̶ó ºÎ¸£¸ç ÀüÇüÀûÀ¸·Î ÆÄÀÏÀ» ´Ý°í, ¹öÆÛ¸¦ µð½ºÅ©¿¡ °Á¦·Î ¾²´Â µîµî¿¡ »ç¿ëµÈ´Ù. finally ºí·ÏÀº try¼½¼Ç¿¡¼ ¹«½¼ÀÏÀÌ ÀϾµçÁö °£¿¡ ¸¶Áö¸·À¸·Î Ç×»ó ½ÇÇàµÈ´Ù.
try: # normal program logic finally: # here we tidy up regardless of the # success/failure of the try block
ƼŬÀº catch Å°¿öµå¸¦ »ç¿ëÇÏ¿© ¾î´ÀÁ¤µµ´Â ºñ½ÁÇÑ ¸ÞÄ«´ÏÁòÀ» °¡Áø´Ù:
set errorcode [catch {
unset x
} msg ]
if {$errorcode != 0} {
# handle error here
}
ÀÌ °æ¿ì¿¡ x ´Â Á¸ÀçÇÏÁö ¾Ê´Â´Ù ±×·¡¼ ¿ì¸®´Â ±×°ÍÀ» ¼³Á¤Ãë¼Ò unset ÇÒ ¼ö ¾ø´Ù. ƼŬÀº ¿¹¿Ü¸¦ ¹ß»ý½ÃÅ°Áö¸¸ catch´Â ÇÁ·Î±×·¥ÀÌ Ãë¼ÒµÇÁö ¾Êµµ·Ï ÇÏ¸ç ´ë½Å¿¡ ¿¡·¯¸Þ½ÃÁö¸¦ msgº¯¼ö¿¡ Áý¾î ³Ö°í 0 ÀÌ ¾Æ´Ñ °ªÀ» ¹ÝȯÇÑ´Ù (±×°ÍÀº ÇÁ·Î±×·¡¸Ó¿¡ ÀÇÇؼ Á¤ÀÇµÉ ¼ö ÀÖ´Ù.). ¿©·¯ºÐÀº ±×·¯¸é errorcode¿¡ ³ªÆ÷µÈ ¹Ýȯ°ªÀ» Á¡°ËÇÒ ¼ö ÀÖ´Ù. ¸¸¾à 0 ÀÌ ¾Æ´Ï¶ó¸é ±×·¯¸é ¿¡·¯°¡ ¹ß»ýµÇ¾ú°í ¿©·¯ºÐÀº msgº¯¼ö¸¦ Á¶»çÇÒ ¼ö ÀÖ´Ù.
º£ÀÌÁ÷Àº ¿¹¿Ü 󸮸¦ Áö¿øÇÏÁö ¾ÊÁö¸¸ ±×·¯³ª Äڵ带 ±ú²ýÇÏ°Ô À¯ÁöÇϴµ¥ µµ¿òÀ» ÁÖ´Â ±¸Á¶¸¦ °¡Áö°í ÀÖ´Ù:
100 OPEN "A:\Temp.dat" FOR INPUT AS #1
110 ON ERROR GOTO 10010
120 REM PROGRAM CODE HERE...
130 ...
10000 REM ERRORHANDLERS:
10010 IF ERR = 54 THEN....
¶óÀÎ ³Ñ¹öÀÇ »ç¿ëÀ» ÁÖ¸ñÇ϶ó. ÀÌ°ÍÀº ÃʱâÀÇ º£ÀÌÁ÷À» Æ÷ÇÔÇÏ¿© ¿¹ÀüÀÇ ÇÁ·Î±×·¡¹Ö ¾ð¾î¿¡¼´Â ÀϹÝÀûÀÎ °ÍÀ̾ú´Ù. ÀÌÁ¦ ¿©·¯ºÐÀº ¶óº§labels·Î °°Àº ÀÏÀ» ÇÒ ¼ö ÀÖ´Ù:
ON ERROR GOTO Handler
REM Now create divide by zero error
x = 5/0
Handler:
IF ERR = 23 THEN
PRINT "Can't divide by 0"
x = 0
RESUME NEXT
END IF
RESUME NEXTÀ» ÁÖ¸ñÇ϶ó. ±×°ÍÀ¸·Î ¿©·¯ºÐÀº ¿¡·¯°¡ ¹ß»ýÇÑ ¹Ù·Î µÚ·Î º¹±ÍÇÏ¿© ±× ÇÁ·Î±×·¥À» °è¼ÓÁøÇàÇÒ ¼ö ÀÖ´Ù.
¿ì¸®°¡ ´Ù¸¥ »ç¶÷µéÀÌ ³ªÆ÷ÇÒ ¼ö ÀÖµµ·Ï ¿¹¿Ü»óȲÀ», ¿¹¸¦ µé¾î ¸ðµâ¿¡¼ ¸¸µé±â¸¦ ¿øÇÑ´Ù¸é ¹«½¼ÀÏÀÌ ÀϾ´Â°¡? ÀÌ °æ¿ì¿¡ ¿ì¸®´Â ÆÄÀ̽㿡 ÀÖ´Â raiseÅ°¿öµå¸¦ »ç¿ëÇÑ´Ù:
numerator = 42 denominator = input("What value will I divide 42 by?") if denominator == 0: raise "zero denominator"
ÀÌ°ÍÀº ¹®ÀÚ¿ °´Ã¼ ¿¹¿Ü¸¦ µé¾î¿Ã·Á try/except ºí·ÏÀÌ ³ªÆ÷ÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù.
Tcl¿¡¼ return ¼¼ú¹®Àº ¼±ÅÃÀûÀÎ -code Ç÷¡±×¸¦ ÃëÇϴµ¥ ±×°ÍÀº °ýÈ£ÃÄÁø catch¿¡ ÀÇÇؼ ³ªÆ÷µÇ¾î Áø´Ù:
proc spam {val} { set x $val return -code 3 [expr $x] } set err [catch { set foo [spam 7] } msg]
err ´Â °ª 3À» °¡Á®¾ß Çϸç msg´Â °ª 7À» °¡Á®¾ß ÇÑ´Ù. ¶Ç ´Ù½Ã ƼŬÀÇ ±¸¹®Àº ÀÌÀü¿¡ ±×·¨´ø °Í º¸´Ù´Â ´ú Á÷°üÀûÀÌ´Ù
º£ÀÌÁ÷¿¡¼ ¿©·¯ºÐÀº ERR º¯¼ö¸¦ ERROR ¼¼ú¹®À¸·Î ¼³Á¤ÇÒ ¼ö ÀÖ´Ù:
ON ERROR GOTO ERRORS INPUT "INPUT ERROR CODE"; E ERROR E ERRORS: IF ERR = 142 THEN PRINT "Error 142 found" STOP ELSE PRINT "No error found" STOP END IF
±â¾ïÇØ¾ß ÇÒ °Í |
---|
|
ÀÌ ÆäÀÌÁö¿¡ ´ëÇÏ¿© Áú¹® ȤÀº Á¦¾È»çÇ×ÀÌ ÀÖÀ¸¸é ´ÙÀ½ ÁÖ¼Ò·Î ³ª¿¡°Ô ÀüÀÚ¸ÞÀÏÀ» º¸³»¶ó:
agauld@crosswinds.net