============================== 14.7 æ•获所有异常 ============================== ---------- 问题 ---------- æ€Žæ ·æ•获代ç ä¸çš„æ‰€æœ‰å¼‚常? ---------- 解决方案 ---------- æƒ³è¦æ•获所有的异常,å¯ä»¥ç›´æŽ¥æ•获 ``Exception`` å³å¯ï¼š .. code-block:: python try: ... except Exception as e: ... log('Reason:', e) # Important! 这个将会æ•获除了 ``SystemExit`` 〠``KeyboardInterrupt`` å’Œ ``GeneratorExit`` 之外的所有异常。 å¦‚æžœä½ è¿˜æƒ³æ•获这三个异常,将 ``Exception`` æ”¹æˆ ``BaseException`` å³å¯ã€‚ ---------- 讨论 ---------- æ•获所有异常通常是由于程åºå‘˜åœ¨æŸäº›å¤æ‚æ“作ä¸å¹¶ä¸èƒ½è®°ä½æ‰€æœ‰å¯èƒ½çš„异常。 å¦‚æžœä½ ä¸æ˜¯å¾ˆç»†å¿ƒçš„äººï¼Œè¿™ä¹Ÿæ˜¯ç¼–å†™ä¸æ˜“调试代ç çš„ä¸€ä¸ªç®€å•æ–¹æ³•。 æ£å› 如æ¤ï¼Œå¦‚æžœä½ é€‰æ‹©æ•获所有异常,那么在æŸä¸ªåœ°æ–¹ï¼ˆæ¯”å¦‚æ—¥å¿—æ–‡ä»¶ã€æ‰“å°å¼‚常到å±å¹•)打å°ç¡®åˆ‡åŽŸå› å°±æ¯”è¾ƒé‡è¦äº†ã€‚ å¦‚æžœä½ æ²¡æœ‰è¿™æ ·åšï¼Œæœ‰æ—¶å€™ä½ çœ‹åˆ°å¼‚å¸¸æ‰“å°æ—¶å¯èƒ½æ‘¸ä¸ç€å¤´è„‘,就åƒä¸‹é¢è¿™æ ·ï¼š .. code-block:: python def parse_int(s): try: n = int(v) except Exception: print("Couldn't parse") 试ç€è¿è¡Œè¿™ä¸ªå‡½æ•°ï¼Œç»“果如下: :: >>> parse_int('n/a') Couldn't parse >>> parse_int('42') Couldn't parse >>> è¿™æ—¶å€™ä½ å°±ä¼šæŒ å¤´æƒ³ï¼šâ€œè¿™å’‹å›žäº‹å•Šï¼Ÿâ€ å‡å¦‚ä½ åƒä¸‹é¢è¿™æ ·é‡å†™è¿™ä¸ªå‡½æ•°ï¼š .. code-block:: python def parse_int(s): try: n = int(v) except Exception as e: print("Couldn't parse") print('Reason:', e) è¿™æ—¶å€™ä½ èƒ½èŽ·å–如下输出,指明了有个编程错误: :: >>> parse_int('42') Couldn't parse Reason: global name 'v' is not defined >>> å¾ˆæ˜Žæ˜¾ï¼Œä½ åº”è¯¥å°½å¯èƒ½å°†å¼‚常处ç†å™¨å®šä¹‰çš„精准一些。 ä¸è¿‡ï¼Œè¦æ˜¯ä½ å¿…é¡»æ•èŽ·æ‰€æœ‰å¼‚å¸¸ï¼Œç¡®ä¿æ‰“å°æ£ç¡®çš„诊æ–ä¿¡æ¯æˆ–å°†å¼‚å¸¸ä¼ æ’å‡ºåŽ»ï¼Œè¿™æ ·ä¸ä¼šä¸¢å¤±æŽ‰å¼‚常。