14.7 �获所有异常¶
问题¶
æ€Žæ ·æ�•获代ç �ä¸çš„æ‰€æœ‰å¼‚常?
解决方案¶
想��获所有的异常,�以直接�获 Exception ��:
try:
...
except Exception as e:
...
log('Reason:', e) # Important!
这个将会�获除了 SystemExit � KeyboardInterrupt 和 GeneratorExit 之外的所有异常。
å¦‚æžœä½ è¿˜æƒ³æ�•获这三个异常,将 Exception 改æˆ� BaseException å�³å�¯ã€‚
讨论¶
æ�•获所有异常通常是由于程åº�员在æŸ�些å¤�æ�‚æ“�作ä¸å¹¶ä¸�能记ä½�所有å�¯èƒ½çš„异常。 å¦‚æžœä½ ä¸�是很细心的人,这也是编写ä¸�易调试代ç �的一个简å�•方法。
æ£å› 如æ¤ï¼Œå¦‚æžœä½ é€‰æ‹©æ�•获所有异常,那么在æŸ�个地方(比如日志文件ã€�打å�°å¼‚常到å±�幕)打å�°ç¡®åˆ‡åŽŸå› å°±æ¯”è¾ƒé‡�è¦�了。 å¦‚æžœä½ æ²¡æœ‰è¿™æ ·å�šï¼Œæœ‰æ—¶å€™ä½ 看到异常打å�°æ—¶å�¯èƒ½æ‘¸ä¸�ç�€å¤´è„‘,就åƒ�下é�¢è¿™æ ·ï¼š
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
>>>
è¿™æ—¶å€™ä½ å°±ä¼šæŒ å¤´æƒ³ï¼šâ€œè¿™å’‹å›žäº‹å•Šï¼Ÿâ€� å�‡å¦‚ä½ åƒ�下é�¢è¿™æ ·é‡�写这个函数:
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
>>>
å¾ˆæ˜Žæ˜¾ï¼Œä½ åº”è¯¥å°½å�¯èƒ½å°†å¼‚常处ç�†å™¨å®šä¹‰çš„精准一些。 ä¸�过,è¦�æ˜¯ä½ å¿…é¡»æ�•获所有异常,确ä¿�打å�°æ£ç¡®çš„诊æ–ä¿¡æ�¯æˆ–å°†å¼‚å¸¸ä¼ æ’å‡ºåŽ»ï¼Œè¿™æ ·ä¸�会丢失掉异常。