Next: , Previous: Processing of Errors, Up: Errors   [Contents][Index]


9.5.3.3 ¥¨¥é¡¼¥Ï¥ó¥É¥é¤Î½ñ¤­Êý

¥¨¥é¡¼¤òÄÌÃΤ¹¤ë¤³¤È¤ÎÉáÄ̤θú²Ì¤Ï¡¢ ¼Â¹ÔÃæ¤Î¥³¥Þ¥ó¥É¤ò½ªÎ»¤·¡¢Emacs¤Î¥¨¥Ç¥£¥¿¥³¥Þ¥ó¥É¥ë¡¼¥×¤Ë¤¿¤À¤Á¤ËÌá¤ê¤Þ¤¹¡£ ÆÉ¼Ô¤Î¥×¥í¥°¥é¥à¤Î°ìÉô¤ÇȯÀ¸¤·¤¿¥¨¥é¡¼¤òÊ᪤¹¤ë¤è¤¦¤Ë¤¹¤ë¤Ë¤Ï¡¢ ¥¹¥Ú¥·¥ã¥ë¥Õ¥©¡¼¥àcondition-case¤ò»È¤Ã¤Æ¥¨¥é¡¼¥Ï¥ó¥É¥é¤òÀßÄꤷ¤Þ¤¹¡£ ñ½ã¤ÊÎã¤Ï¤Ä¤®¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£

(condition-case nil
    (delete-file filename)
  (error nil))

¤³¤ì¤Ïfilename¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤òºï½ü¤·¤Þ¤¹¤¬¡¢ ¥¨¥é¡¼¤¬È¯À¸¤¹¤ë¤È¤É¤ó¤Ê¥¨¥é¡¼¤Ç¤âÊ᪤·¤Ænil¤òÊÖ¤·¤Þ¤¹¡£

condition-case¤ÎÂè2°ú¿ô¤ò Êݸ¤ì¤¿¥Õ¥©¡¼¥à¡Êprotected form¡Ë¤È¸Æ¤Ó¤Þ¤¹¡£ ¡Ê¾å¤ÎÎã¤Ç¤Ï¡¢Êݸ¤ì¤¿¥Õ¥©¡¼¥à¤Ïdelete-file¤Î¸Æ¤Ó½Ð¤·¡£¡Ë ¤³¤Î¥Õ¥©¡¼¥à¤Î¼Â¹Ô¤ò³«»Ï¤¹¤ë¤È¥¨¥é¡¼¥Ï¥ó¥É¥é¤¬Í­¸ú¤Ë¤Ê¤ê¡¢ ¤³¤Î¥Õ¥©¡¼¥à¤«¤éÌá¤ë¤È¥¨¥é¡¼¥Ï¥ó¥É¥é¤Ï¼è¤ê½ü¤«¤ì¤Þ¤¹¡£ ¤½¤Î¤¢¤¤¤À¤Ï¡¢¤Ä¤Í¤Ë¥¨¥é¡¼¥Ï¥ó¥É¥é¤ÏÍ­¸ú¤Ç¤¹¡£ ÆÃ¤Ë¡¢¤³¤Î¥Õ¥©¡¼¥à¤«¤é¸Æ¤Ó½Ð¤µ¤ì¤ë´Ø¿ô¤Î¼Â¹ÔÃæ¡¢ ¤½¤ì¤é¤Î¥µ¥Ö¥ë¡¼¥Æ¥£¥ó¤Î¼Â¹ÔÃæ¤Ê¤É¤Ë¤Ï¡¢¥¨¥é¡¼¥Ï¥ó¥É¥é¤ÏÍ­¸ú¤Ç¤¹¡£ ¤³¤ì¤ÏÂçÀڤʤ³¤È¤Ç¡¢¸·Ì©¤Ë¤¤¤¨¤Ð¡¢ ¥¨¥é¡¼¤¬ÄÌÃΤµ¤ì¤ë¤Î¤Ï¡¢Êݸ¤ì¤¿¥Õ¥©¡¼¥à¤«¤é¸Æ¤Ó½Ð¤µ¤ì¤¿ ¡Êsignal¤äerror¤ò´Þ¤à¡ËLisp´ðËÜ´Ø¿ô¤Î¼Â¹ÔÃæ¤Ç¤¢¤Ã¤Æ¡¢ Êݸ¤ì¤¿¥Õ¥©¡¼¥à¤½¤Î¤â¤Î¤«¤é¤Ç¤Ï¤Ê¤¤¤«¤é¤Ç¤¹¡£

Êݸ¤ì¤¿¥Õ¥©¡¼¥à¤Î¤¦¤·¤í¤Ë¤¢¤ë°ú¿ô¤Ï¡¢¥Ï¥ó¥É¥é¤Ç¤¹¡£ ³Æ¥Ï¥ó¥É¥é¤Ï1¤Ä°Ê¾å¤Î¡Ê¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡Ë¾ò·ï̾ ¡Êcondition names¡Ë¤òÎóµó¤·¡¢½èÍý¤¹¤ë¥¨¥é¡¼¤ò»ØÄꤷ¤Þ¤¹¡£ ¥¨¥é¡¼¤¬ÄÌÃΤµ¤ì¤¿¤È¤­¤Î¥¨¥é¡¼¥·¥ó¥Ü¥ë¤â¾ò·ï̾¤Î¥ê¥¹¥È¤òÄêµÁ¤·¤Þ¤¹¡£ ¤½¤ì¤é¤Ë¶¦Ä̤ξò·ï̾¤¬¤¢¤ë¤È¤­¡¢ ¥¨¥é¡¼¥Ï¥ó¥É¥é¤¬¥¨¥é¡¼¤ËŬÍѤµ¤ì¤Þ¤¹¡£ ¾å¤ÎÎã¤Ç¤Ï¡¢1¤Ä¤Î¥Ï¥ó¥É¥é¤¬¤¢¤ê¡¢¾ò·ï̾¤Ï1¤Ä¡¢error¤ò»ØÄꤷ¤Æ¤¤¤Þ¤¹¡£ ¤³¤Î¾ò·ï̾¤Ï¤¹¤Ù¤Æ¤Î¥¨¥é¡¼¤ò°ÕÌ£¤·¤Þ¤¹¡£

ŬÍѲÄǽ¤Ê¥Ï¥ó¥É¥é¤Îõº÷¤Ç¤Ï¡¢ ¤â¤Ã¤È¤âºÇ¶á¤Ë³ÎΩ¤µ¤ì¤¿¥Ï¥ó¥É¥é¤«¤é»Ï¤á¤Æ¡¢ ³ÎΩ¤µ¤ì¤¿¤¹¤Ù¤Æ¤Î¥Ï¥ó¥É¥é¤òÄ´¤Ù¤Þ¤¹¡£ ¤·¤¿¤¬¤Ã¤Æ¡¢¥Õ¥©¡¼¥àcondition-case¤¬2¤ÄÆþ¤ì»Ò¤Ë¤Ê¤Ã¤Æ¤¤¤Æ Ʊ¤¸Ì¾Á°¤Î¥Ï¥ó¥É¥é¤ò³ÎΩ¤·¤Æ¤¤¤ë¤È¡¢Æâ¦¤Î¤â¤Î¤¬¼ÂºÝ¤Ë½èÍý¤ò¼õ¤±»ý¤Á¤Þ¤¹¡£

¥Õ¥©¡¼¥àcondition-case¤Ç¥¨¥é¡¼¤¬½èÍý¤µ¤ì¤ë¤È¤­¤Ë¤Ï¡¢ debug-on-error¤Ç¥¨¥é¡¼¤Ë¤è¤ê¥Ç¥Ð¥Ã¥¬¤òµ¯Æ°¤¹¤ë¤è¤¦¤Ë»ØÄꤷ¤Æ¤¢¤Ã¤Æ¤â ¥Ç¥Ð¥Ã¥¬¤Ï¼Â¹Ô¤µ¤ì¤Þ¤»¤ó¡£ See Error Debugging¡£ condition-case¤ÇÊ᪤µ¤ì¤ë¥¨¥é¡¼¤ò¥Ç¥Ð¥Ã¥°¤·¤¿¤¤¤È¤­¤Ë¤Ï¡¢ ÊÑ¿ôdebug-on-signal¤Ënil°Ê³°¤ÎÃͤòÀßÄꤷ¤Þ¤¹¡£

¥¨¥é¡¼¤ò½èÍý¤Ç¤­¤ë¾ì¹ç¤Ë¤Ï¡¢À©¸æ¤Ï¥Ï¥ó¥É¥é¤Ë°Ü¤ê¤Þ¤¹¡£ ¤³¤¦¤¹¤ë¤Þ¤¨¤Ë¡¢Emacs¤Ï¡¢È´¤±½Ð¤·ÂоݤȤʤë«ÇûºîÀ®¹½Â¤¤¬ÀßÄꤷ¤¿ ¤¹¤Ù¤Æ¤ÎÊÑ¿ô«Çû¤ò²ò¤­¡¢È´¤±½Ð¤·ÂоݤȤʤë¥Õ¥©¡¼¥àunwind-protect ¤¹¤Ù¤Æ¤Î¸å»ÏËö¤ò¼Â¹Ô¤·¤Þ¤¹¡£ ¥Ï¥ó¥É¥é¤ËÀ©¸æ¤¬°Ü¤ë¤È¡¢¥Ï¥ó¥É¥é¤ÎËÜÂΤò¼Â¹Ô¤·¤Þ¤¹¡£

¥Ï¥ó¥É¥éËÜÂΤμ¹Ԥò´°Î»¤¹¤ë¤È¡¢ ¥Õ¥©¡¼¥àcondition-case¤«¤éÌá¤ê¤Þ¤¹¡£ ¥Ï¥ó¥É¥é¤ò¼Â¹Ô¤¹¤ë¤Þ¤¨¤ËÊݸ¤ì¤¿¥Õ¥©¡¼¥à¤«¤é´°Á´¤ËÈ´¤±¤Æ¤¤¤ë¤Î¤Ç¡¢ ¥Ï¥ó¥É¥é¤Ç¤Ï¡¢¥¨¥é¡¼È¯À¸»þÅÀ¤«¤éºÆ³«¤·¤¿¤ê¡¢ Êݸ¤ì¤¿¥Õ¥©¡¼¥à¤ÎÆâ¦¤Çºî¤é¤ì¤¿ÊÑ¿ô«Çû¤òÄ´¤Ù¤¿¤ê¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£ ¥Ï¥ó¥É¥é¤Ç¤Ç¤­¤ë¤³¤È¤Ï¡¢¸å»ÏËö¤ò¤·¤ÆÀè¤Ø¿Ê¤à¤³¤È¤À¤±¤Ç¤¹¡£

condition-case¹½Â¤¤Ï¡¢insert-file-contents¤Î¸Æ¤Ó½Ð¤·¤Ç ¥Õ¥¡¥¤¥ë¤Î¥ª¡¼¥×¥ó¤Ë¼ºÇÔ¤¹¤ë¤Ê¤É¤Îͽ¬²Äǽ¤Ê¥¨¥é¡¼¤òÊ᪤¹¤ë¤¿¤á¤Ë ¤·¤Ð¤·¤Ð»È¤ï¤ì¤Þ¤¹¡£ ¥×¥í¥°¥é¥à¤¬¥æ¡¼¥¶¡¼¤«¤éÆÉ¤ß¼è¤Ã¤¿¼°¤òɾ²Á¤¹¤ë¾ì¹ç¤Î¤è¤¦¤Ë¡¢ ¤Þ¤Ã¤¿¤¯Í½Â¬ÉÔ²Äǽ¤Ê¥¨¥é¡¼¤òÊ᪤¹¤ë¤¿¤á¤Ë¤â»È¤ï¤ì¤Þ¤¹¡£

¥¨¥é¡¼ÄÌÃΤȥ¨¥é¡¼½èÍý¤Ï¡¢throw¤Ècatch¤Ë¿¾¯»÷¤Æ¤¤¤Þ¤¹¤¬¡¢ ¤½¤ì¤é¤Ï¤Þ¤Ã¤¿¤¯Ê̤ε¡Ç½¤Ç¤¹¡£ catch¤Ç¤Ï¥¨¥é¡¼¤òÊ᪤Ǥ­¤Þ¤»¤ó¤·¡¢ ¥¨¥é¡¼¥Ï¥ó¥É¥é¤Ç¤Ïthrow¤ò½èÍý¤Ç¤­¤Þ¤»¤ó ¡Ê¤·¤«¤·¤Ê¤¬¤é¡¢Å¬ÀÚ¤Êcatch¤¬¤Ê¤¤throw¤ò»È¤¦¤È¡¢ ½èÍý¤Ç¤­¤ë¥¨¥é¡¼¤òÄÌÃΤ¹¤ë¡Ë¡£

Special Form: condition-case var protected-form handlers…

¤³¤Î¥¹¥Ú¥·¥ã¥ë¥Õ¥©¡¼¥à¤Ï¡¢protected-form¤Î¼Â¹ÔÃæ¤Ï ¥¨¥é¡¼¥Ï¥ó¥É¥éhandlers¤ò³ÎΩ¤¹¤ë¡£ protected-form¤¬¥¨¥é¡¼¤Ê¤·¤Ë´°Î»¤¹¤ë¤È¡¢ ¤½¤ÎÌá¤êÃͤ¬¥Õ¥©¡¼¥àcondition-case¤ÎÃͤˤʤ롣 ¤³¤Î¾ì¹ç¡¢condition-case¤Ï¤Ê¤ó¤Î¸ú²Ì¤â¤Ê¤¤¡£ ¥Õ¥©¡¼¥àcondition-case¤Ç°ã¤¤¤¬¤Ç¤ë¤Î¤Ï¡¢ protected-form¤Î¼Â¹ÔÃæ¤Ë¥¨¥é¡¼¤¬µ¯¤³¤Ã¤¿¾ì¹ç¤Ç¤¢¤ë¡£

³Æhandlers¤Ï¡¢(conditions body…)¤Î·Á¼°¤Î ¥ê¥¹¥È¤Ç¤¢¤ë¡£ ¤³¤³¤Çconditions¤Ï¡¢½èÍý¤¹¤Ù¤­¥¨¥é¡¼¤Î¾ò·ï̾¤«¾ò·ï̾¤Î¥ê¥¹¥È¤Ç¤¢¤ë¡£ body¤Ï1¤Ä°Ê¾å¤ÎLisp¼°¤Ç¤¢¤ê¡¢ ¤³¤Î¥Ï¥ó¥É¥é¤¬¥¨¥é¡¼¤ò½èÍý¤¹¤ë¤È¤­¤Ë¼Â¹Ô¤µ¤ì¤ë¡£ ¥Ï¥ó¥É¥é¤ÎÎã¤ò¼¨¤¹¡£

(error nil)

(arith-error (message "Division by zero"))

((arith-error file-error)
 (message
  "Either division by zero or failure to open a file"))

À¸µ¯¤¹¤ë³Æ¥¨¥é¡¼¤Ë¤Ï¡¢ ¤½¤Î¥¨¥é¡¼¤Î¼ïÎà¤òɽ¤¹¥¨¥é¡¼¥·¥ó¥Ü¥ë¡Êerror symbol¡Ë¤¬¤¢¤ë¡£ ¤½¤Î¥·¥ó¥Ü¥ë¤Î°À­error-conditions¤Ï¡¢ ¾ò·ï̾¤Î¥ê¥¹¥È¤Ç¤¢¤ë¡Êsee Error Symbols¡Ë¡£ Emacs¤Ï¡¢Í­¸ú¤Ê¥Õ¥©¡¼¥àcondition-case¤¹¤Ù¤Æ¤òõº÷¤·¡¢ ¤³¤ì¤é¤Î¾ò·ï̾¤ò1¤Ä°Ê¾å»ØÄꤷ¤¿¥Ï¥ó¥É¥é¤òõ¤¹¡£ ¤â¤Ã¤È¤âÆâ¦¤Î°ìÃפ¹¤ëcondition-case¤¬¥¨¥é¡¼¤ò½èÍý¤¹¤ë¡£ ¤³¤Îcondition-case¤ÎÆâ¦¤Ç¤Ï¡¢ ŬÍѲÄǽ¤ÊºÇ½é¤Î¥Ï¥ó¥É¥é¤¬¥¨¥é¡¼¤ò½èÍý¤¹¤ë¡£

¥Ï¥ó¥É¥é¤ÎËÜÂΤμ¹Ԥò´°Î»¤¹¤ë¤È¡¢ condition-case¤ÏÄ̾ï¤Î¤è¤¦¤ËÌá¤ê¡¢ ¥Ï¥ó¥É¥é¤ÎËÜÂΤκǸå¤Î¥Õ¥©¡¼¥à¤ÎÃͤòÁ´ÂΤȤ·¤Æ¤ÎÃͤ˻Ȥ¦¡£

°ú¿ôvar¤ÏÊÑ¿ô¤Ç¤¢¤ë¡£ condition-case¤Ï¡¢protected-form¤ò¼Â¹Ô¤¹¤ë¤È¤­¤Ë¤Ï ¤³¤ÎÊÑ¿ô¤ò«Çû¤»¤º¡¢¥¨¥é¡¼¤ò½èÍý¤¹¤ë¤È¤­¤À¤±Â«Çû¤¹¤ë¡£ ¤½¤Î¤È¤­¡¢var¤Ï¥í¡¼¥«¥ë¤Ë¥¨¥é¡¼µ­½Ò ¡Êerror description¡Ë¤Ë«Çû¤µ¤ì¤ë¡£ ¤³¤ì¤Ï¡¢¥¨¥é¡¼¤Î¾ÜºÙ¤òÍ¿¤¨¤ë¥ê¥¹¥È¤Ç¤¢¤ë¡£ ¥¨¥é¡¼µ­½Ò¤Ï¡¢(error-symbol . data)¤Î·Á¼°¤Ç¤¢¤ë¡£ ¥Ï¥ó¥É¥é¤Ï¡¢Æ°ºî¤ò·èÄꤹ¤ë¤¿¤á¤Ë¤³¤Î¥ê¥¹¥È¤ò»²¾È¤Ç¤­¤ë¡£ ¤¿¤È¤¨¤Ð¡¢¥Õ¥¡¥¤¥ë¤Î¥ª¡¼¥×¥ó¤Ë¼ºÇÔ¤·¤¿¥¨¥é¡¼¤Ç¤¢¤ì¤Ð¡¢ data¤ÎÂè2Í×ÁÇ¡¢¥¨¥é¡¼µ­½Ò¤ÎÂè3Í×ÁǤ¬¥Õ¥¡¥¤¥ë̾¤Ç¤¢¤ë¡£

var¤¬nil¤Ç¤¢¤ë¤È¡¢ÊÑ¿ô¤ò«Çû¤·¤Ê¤³¤È¤ò°ÕÌ£¤¹¤ë¡£ ¤½¤¦¤¹¤ë¤È¡¢¥Ï¥ó¥É¥é¤Ç¤Ï¥¨¥é¡¼¥·¥ó¥Ü¥ë¤È´ØÏ¢¤¹¤ë¥Ç¡¼¥¿¤ò»È¤¨¤Ê¤¤¡£

Function: error-message-string error-description

¤³¤Î´Ø¿ô¤Ï¡¢»ØÄꤷ¤¿¥¨¥é¡¼µ­½Ò¤ËÂФ¹¤ë¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸Ê¸»úÎó¤òÊÖ¤¹¡£ ¥¨¥é¡¼¤ËÂФ¹¤ëÉáÄ̤Υ¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤òɽ¼¨¤·¤Æ¡¢ ¥¨¥é¡¼¤ò½èÍý¤·¤¿¤¤¾ì¹ç¤ËÊØÍø¤Ç¤¢¤ë¡£

¥¼¥í½ü»»¤Î·ë²Ì¤Ç¤¢¤ë¥¨¥é¡¼¤ò½èÍý¤¹¤ëcondition-case¤Î»ÈÍÑÎã¤ò¼¨¤·¤Þ¤¹¡£ ¥Ï¥ó¥É¥é¤Ï¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤ò¡Ê¥Ù¥ë¤òÌĤ餵¤º¤Ë¡Ëɽ¼¨¤·¤Æ¡¢ Â礭¤Ê¿ô¤òÊÖ¤·¤Þ¤¹¡£

(defun safe-divide (dividend divisor)
  (condition-case err                
      ;; Êݸ¤ì¤¿¥Õ¥©¡¼¥à
      (/ dividend divisor)              
    ;; ¥Ï¥ó¥É¥é
    (arith-error                        ; ¾ò·ï
     ;; ¤³¤Î¥¨¥é¡¼¤ËÂФ¹¤ëÉáÄ̤Υá¥Ã¥»¡¼¥¸¤òɽ¼¨¤¹¤ë
     (message "%s" (error-message-string err))
     1000000)))
⇒ safe-divide
(safe-divide 5 0)
     -| Arithmetic error: (arith-error)
⇒ 1000000

¥Ï¥ó¥É¥é¤Ï¾ò·ï̾arith-error¤ò»ØÄꤷ¤Æ¤¤¤ë¤Î¤Ç¡¢ ¥¼¥í½ü»»¥¨¥é¡¼¤À¤±¤ò½èÍý¤·¤Þ¤¹¡£ ¾¯¤Ê¤¯¤È¤â¤³¤Îcondition-case¤Ç¤Ï¾¤Î¼ïÎà¤Î¥¨¥é¡¼¤Ï½èÍý¤·¤Þ¤»¤ó¡£ ¤·¤¿¤¬¤Ã¤Æ¡¢¤Ä¤®¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹

(safe-divide nil 3)
     error→ Wrong type argument: number-or-marker-p, nil

°Ê²¼¤Ï¡¢error¤ÇÄÌÃΤµ¤ì¤ë¥¨¥é¡¼¤â´Þ¤á¤Æ¡¢ ¤¹¤Ù¤Æ¤Î¼ïÎà¤Î¥¨¥é¡¼¤òÊ᪤¹¤ëcondition-case¤Ç¤¹¡£

(setq baz 34)
     ⇒ 34
(condition-case err
    (if (eq baz 35)
        t
      ;; ¤³¤ì¤Ï´Ø¿ôerror¤Î¸Æ¤Ó½Ð¤·
      (error "Rats!  The variable %s was %s, not 35" 'baz baz))
  ;; ¤³¤ì¤Ï¥Ï¥ó¥É¥é¡£¥Õ¥©¡¼¥à¤Ç¤Ï¤Ê¤¤
  (error (princ (format "The error was: %s" err)) 
         2))
-| The error was: (error "Rats!  The variable baz was 34, not 35")
⇒ 2

Next: , Previous: Processing of Errors, Up: Errors   [Contents][Index]