Pythonã§ã³ãŒããå®è¡ãããšããçªç¶ç»é¢ãã£ã±ãã«è¡šç€ºãããèµ€ãæåã®çŸ åââãããããã¬ãŒã¹ããã¯ãèŠãŠãæããåºãŸã£ãŠããŸã£ãçµéšã¯ãããŸãããïŒãè±èªã°ã£ããã§äœãæžããŠãããããããªããããšãããããšã©ãŒã¡ãã»ãŒãžã ãã°ã°ãããšãã人ãå€ãã¯ãã
ã§ãå®ã¯ããã¬ãŒã¹ããã¯ã«ã¯ãã©ã®ãã¡ã€ã«ã®ãäœè¡ç®ã§ãã©ããªé çªã§åŠçãåŒã°ããŠãã©ãã§ãšã©ãŒãèµ·ãããããšããããã°ä¿®æ£ã«å¿ èŠãªæ å ±ããã£ããè©°ãŸã£ãŠããŸããèªã¿æ¹ãããã¹ã¿ãŒããã°ããšã©ãŒã¯ãæµãã§ã¯ãªããæé«ã®ãã³ããã«å€ãããŸãâš
ãã¬ãŒã¹ããã¯ïŒtracebackïŒã¯ãè±èªåã§ã¯ã¹ã¿ãã¯ãã¬ãŒã¹ïŒstack traceïŒãšãåŒã°ãããããã°ã©ã ããšã©ãŒã§åæ¢ãããšãã«è¡šç€ºãããæ å ±ã®ããšã§ããäžèº«ã¯ãããã°ã©ã ãã©ããªé çªã§é¢æ°ãåŒã³åºããŠãããããèšé²ããå±¥æŽã§ãäŸå€ïŒãšã©ãŒïŒãçºçãããšãã«èªåçã«åºåãããŸãã
Pythonã«ã¯æšæºã§ traceback ã¢ãžã¥ãŒã«ãçšæãããŠããŠãããã䜿ãã°ãã¬ãŒã¹ããã¯ã®æ
å ±ãæååãšããŠååŸãããããã°ãã¡ã€ã«ã«æžãåºããããšèªåšã«æ±ããããã«ãªããŸãð ïž
äŸå€åŠçã®äžã§ traceback.format_exc() ãåŒã³åºããšãçŸåšã®ãã¬ãŒã¹ããã¯æ
å ±ãæååãšããŠååŸã§ããŸãã
import traceback
try:
    1 / 0
except Exception:
    print("--- ãã¬ãŒã¹ããã¯åºåéå§ ---")
    print(traceback.format_exc())
    print("--- ãã¬ãŒã¹ããã¯åºåçµäº ---")
ãããš 1 / 0 ã§ ZeroDivisionError ãèµ·ãããããã except ã§ãã£ããããŠè¡šç€ºããŠããŸããå®è¡ããã°ãèŠæ
£ãããTraceback (most recent call last):ãããå§ãŸãæååããèªåã§æžãã print ã«ãã£ãŠåºåãããããšã確èªã§ããŸãð¡
ãã¬ãŒã¹ããã¯ã¯æ å ±éãå€ãã®ã§ãæåã¯å§åãããã¡ãã§ãæ§é ã¯ã·ã³ãã«ã§ã次ã®3ã€ã®ããŒãã«åããŠèªãã ãã§å šäœåãã€ãããŸãã
ãã¬ãŒã¹ããã¯ã¯äžããäžã«åãã£ãŠãããã°ã©ã ãå®è¡ãããé çªã«äžŠãã§ããŸããäŸãã°æ¬¡ã®ãããªæ§é ã®ã³ãŒããèããŠã¿ãŸãããã
code.pyïŒã¡ã€ã³ãã¡ã€ã«ïŒã® main() 颿°ã code2.py ã® func1() ãåŒã¶code2.py ã® func1() ã func2() ãåŒã¶func2() ã®äžã§ 1 / 0 ãå®è¡ãã㊠ZeroDivisionError çºçãã®ãšãã®ãã¬ãŒã¹ããã¯ã¯ãäžãããmain â func1 â func2 â ãšã©ãŒçºçãã®é ã«äžŠã³ãŸããäžçªäžãæåã«åŒã°ããåŠçã§ãäžçªäžãå®éã«ãšã©ãŒãèµ·ããå Žæã§ãã
ãã¬ãŒã¹ããã¯ã®äžã®åè¡ã«ã¯ãFile "ãã¡ã€ã«å", line è¡çªå·, in 颿°å ãšãã圢åŒã§ãã©ã®ãã¡ã€ã«ã®ã»äœè¡ç®ã®ã»ã©ã®é¢æ°ã®äžã®åŠçãå®è¡ãããããæžãããŠããŸãããã®äžã®è¡ã«ã¯ããã®æç¹ã§å®è¡ãããŠããã³ãŒããã®ãã®ã衚瀺ãããŸãã
File "code.py", line 8, in main
    func1()
File "code2.py", line 2, in func1
    func2()
File "code2.py", line 5, in func2
    return 1 / 0
ãã®ããã«ããšã©ãŒãŸã§ã®æµãããã¡ã€ã«ããŸããã§æç¢ºã«ããããŸãð
ãã¬ãŒã¹ããã¯ã®æäžè¡ã«ã¯ãçºçããäŸå€ã®çš®é¡ãšçç±ãæžãããŸãã
ZeroDivisionError: division by zero
ãããããŒãé€ç®ã§ããããšããããã¡ã®æ å ±ããäžããèªãã§ãšã©ãŒã®çš®é¡ãææ¡ â äžã«æ»ã£ãŠåŒã³åºãã®æµãã远ãããšããèªã¿æ¹ãå®çªã®ãã¯ããã¯ã§ãã
ãç»é¢ã«åºãã ãã§ãªãããšã©ãŒæ å ±ãèšé²ã«æ®ããããå Žé¢ã§ã¯ããã¬ãŒã¹ããã¯ããã°ãã¡ã€ã«ã«æžãåºãã®ãå®ç³ã§ãããµãŒããŒã§åãã¢ããªã±ãŒã·ã§ã³ããå€éãããåŠçã§ã¯ç¹ã«éå®ããŸãð
import logging
import tracebacklogger = logging.getLogger(__name__)
handler = logging.FileHandler("error.log")
logger.addHandler(handler)
logger.setLevel(logging.ERROR)try:
    1 / 0
except Exception:
    logger.error(traceback.format_exc())
FileHandler ã§ãã°ãã¡ã€ã«ãæå®ããlogger.error() ã« traceback.format_exc() ã®æ»ãå€ãæž¡ãã ããããã§ãšã©ãŒãèµ·ãããã³ã«ããã¬ãŒã¹ããã¯æ
å ±ã error.log ã«è¿œèšãããŠãããŸãð
ããã®ã³ã°æ©èœãŸã§ã¯å€§ãããããšããããå¥ãã¡ã€ã«ã«åºãããã ãããšããå Žåã¯ãtraceback.print_exc() ã«ãã¡ã€ã«ãªããžã§ã¯ããæž¡ãæ¹æ³ããããŸãã
import traceback
try:
    1 / 0
except Exception:
    with open("traceback.log", "w") as f:
        traceback.print_exc(file=f)
file åŒæ°ã«ãã¡ã€ã«ãªããžã§ã¯ããæž¡ãã ãã§ããã¬ãŒã¹ããã¯ããã®ãŸãŸãã¡ã€ã«ã«æžã蟌ãŸããŸããã·ã³ãã«ãªããŒã«ãã¹ã¯ãªããã«ã¯ååãªæ©èœã§ãâš
äŸå€ããã£ããããã«æŸçœ®ããã°ãPythonã¯æšæºã§ãã¬ãŒã¹ããã¯ãç»é¢ã«åºåããŠãããŸããã§ã¯ããªããããã traceback ã¢ãžã¥ãŒã«ã䜿ãã®ã§ããããïŒçãã¯ããã§ãã
ã€ãŸãããšã©ãŒã¯èµ·ãããã©ããããã©ã掻ãããããã³ã³ãããŒã«ããããšãã« traceback ã¢ãžã¥ãŒã«ã掻èºããããã§ãð¯
ãã¬ãŒã¹ããã¯ãèªã¿è§£ãåã¯ãéçºè ã«ãšã£ãŠäžçã¢ãã®ã¹ãã«ãäœç³»çã«åŠã¹ãæžç±ããããšãç¿åŸã¹ããŒããæ Œæ®µã«äžãããŸãâš
äŸå€åŠçã»ãã®ã³ã°ã»ãããã°ãšãã£ãçŸå Žã§å¿ é ã®æè¡ã90é ç®ã§ç¶²çŸ ãäžçŽè ãžã®ã¹ãããã¢ããã«æé©ãª1åã§ãã
ãããããã°ãå ¥ãã«ããã³ãŒãèšèšããšã©ãŒãèµ·ãããšãã®é©åãªå¯ŸåŠæ³ã培åºè§£èª¬ãå®åã§Pythonãæžãæ¹ã«ã¯ç¹ã«ããããã§ãã
Pythonã®åºæ¬æ§æã»æšæºã©ã€ãã©ãªãç¶²çŸ
ããå®çªæžãtraceback ã logging ã®ä»æ§ã確èªããããšãã«ãé Œãã«ãªããŸãã
é·æéã®ã³ãŒãèªã¿ã»ä¿®æ£ã«ãç²ãã«ããããŒããŒãã¯ããšã©ãŒè§£æã®éäžåãæ¯ããŠãããé Œãããçžæ£ã§ãã
ãã¬ãŒã¹ããã¯ã»ãœãŒã¹ã³ãŒãã»ãã°ãã¡ã€ã«ã䞊ã¹ãŠèŠããããã¥ã¢ã«ãã£ã¹ãã¬ã€ç°å¢ã¯ããšã©ãŒè§£æã®å¹çãäžæ°ã«åºäžãããŠãããŸãð¥ïž
A. ç¶æ³ã«ãããŸãããäœã®ãšã©ãŒãããçŽ æ©ãç¥ããããªãäžããïŒæäžè¡ã«äŸå€åãšã¡ãã»ãŒãžããããŸãïŒãããªããã®ãšã©ãŒã«ãªã£ãããã远跡ããããªãäžããèªãã®ãããããã§ããæ £ããŠããããäžã§çš®é¡ãææ¡ â äžã§çµè·¯ã蟿ãããå®çªã®ãããŒã«ãªããŸãã
traceback.format_exc() ãš traceback.print_exc() ã®éãã¯ïŒA. format_exc() ã¯ãã¬ãŒã¹ããã¯ãæååãšããŠè¿ã颿°ã§ããã°åºåãã¡ãŒã«éä¿¡ãªã©ã«å å·¥ãããã圢ã§ããäžæ¹ print_exc() ã¯çŽæ¥åºåãã颿°ã§ãåŒæ° file ãæå®ããã°ãã¡ã€ã«ã«ãæžã蟌ããŸããçšéã«å¿ããŠäœ¿ãåããŸãããã
A. traceback.format_exc() 㯠except ãããã¯å
ã§ãçŸåšåŠçäžã®äŸå€ãã®ãã¬ãŒã¹ããã¯ãååŸãã颿°ãªã®ã§ãäŸå€ããã£ããããå¿
èŠããããŸãããã ãããã¬ãŒã® logger.exception() ã䜿ãã°ãã¡ãã»ãŒãžãšãã¬ãŒã¹ããã¯ãåæã«ãã°åºåã§ãããªã©ã䟿å©ãªéžæè¢ãä»ã«ããããŸãã
A. traceback.format_exc(limit=N) ã traceback.print_exc(limit=N) ã®ããã« limit åŒæ°ãæå®ãããšã衚瀺ããéå±€æ°ãå¶éã§ããŸããæ·±ãã©ã€ãã©ãªåŒã³åºãã§åãããŠããŸããšãã«ãèªåã®ã³ãŒãã«è¿ãéšåã ããæœåºããã®ã«äŸ¿å©ã§ãã
A. æ¬çªç°å¢ã§ã¯çµ¶å¯Ÿã«é¿ããã¹ãã§ãããã¬ãŒã¹ããã¯ã«ã¯ãã¡ã€ã«ãã¹ãå éšæ§é ã®æ å ±ãå«ãŸãããããæ»æè ã«ãšã£ãŠæçãªãã³ãã«ãªããããŸãããæ¬çªã§ã¯ãŠãŒã¶ãŒã«ã¯æ±çšçãªãšã©ãŒç»é¢ã衚瀺ãããã¬ãŒã¹ããã¯ã¯ãã°ãã¡ã€ã«ã«ã®ã¿èšé²ããã®ãéåã§ãð¡ïž
èµ€ãæåã«æ¯ããæä»£ã¯ããçµããããã¬ãŒã¹ããã¯ã¯ãã©ã®ãã¡ã€ã«ã®ãäœè¡ç®ã§ãã©ããªé çªã§é¢æ°ãåŒã°ããŠãäœã®ãšã©ãŒãèµ·ãããããäžç®ã§æããŠããããéçºè ã«ãšã£ãŠæãä¿¡é Œã§ããæ å ±æºã§ãâš
äžããäŸå€ã®çš®é¡ãææ¡ããŠãäžããåŒã³åºãã®æµãã远ãââãã®èªã¿æ¹ã身ã«ã€ããã ãã§ããã°ä¿®æ£ã«ãããæéã¯åçã«çããªããŸããããã« traceback ã¢ãžã¥ãŒã«ã䜿ã£ãŠãã°ãã¡ã€ã«ã«æ®ããããã«ãªãã°ãæ¬çªéçšãå€éãããã§ã®ãã©ãã«ã·ã¥ãŒãã£ã³ã°ãã°ããšæ¥œã«ãªããŸãð
次ã«ãšã©ãŒã«ééãããšãã¯ãæ ãŠãã«ãããã¯æé«ã®ãã³ãã ããšæã£ãŠããã£ãã1è¡ãã€èªãã§ã¿ãŠãã ããããã£ãšããããããïŒããšãã°ã®æ£äœãèŠããŠããã¯ãã§ãð¡
ð ãåãã³ãŒãããããèœã¡ãª…
ð Pythonã®ãå¶åŸ¡æ§æã…
ð ãæååãèªåšã«æãã人ã…
ð ãèªã¿ãããã³ãŒããã¯å€æ°…
ð ããã°ã©ãã³ã°ã®ãã¹ãŠã¯ã…
ð ãæååã«å€æ°ãå ¥ãããã…