類似於Java的try..catch..finally
Java的為try_except_finally
try: print(`try...`) r = 10 / 0 print(`result:`, r) except ZeroDivisionError as e: print(`except:`, e) finally: print(`finally...`) print(`END`)
try執行一段可能會傳送異常的程式碼,如果有異常情況傳送 走except , 如果沒有則不走,最後不管程式碼有沒有傳送異常,都會執行finally裡的程式碼
異常錯誤存在父子類問題,如果父類處理了,子類則不會再接收處理
—————————————————————————————————————————————————————–
除錯
1、列印print
最簡單的就是print 把資料列印出來再去找錯誤原因
問題在於會在程式碼中出現很多列印語句
2、斷言assert
assert n != 0, `n is zero!`
assert
的意思是,表示式n != 0
應該是True
,否則,根據程式執行的邏輯,後面的程式碼肯定會出錯。
如果斷言失敗,assert
語句本身就會丟擲AssertionError
:
$ python err.py
Traceback (most recent call last):
...
AssertionError: n is zero!
注:
程式中如果到處充斥著assert
,和print()
相比也好不到哪去。不過,啟動Python直譯器時可以用-O
引數來關閉assert
:
關閉後,你可以把所有的assert
語句當成pass
來看。
$ python -O err.py
Traceback (most recent call last):
...
ZeroDivisionError: division by zero
3、logging
logging
的好處,它允許你指定記錄資訊的級別,有debug
,info
,warning
,error
等幾個級別,當我們指定level=INFO
時,logging.debug
就不起作用了。同理,指定level=WARNING
後,debug
和info
就不起作用了。這樣一來,你可以放心地輸出不同級別的資訊,也不用刪除,最後統一控制輸出哪個級別的資訊。
logging
的另一個好處是通過簡單的配置,一條語句可以同時輸出到不同的地方,比如console和檔案。
import logging logging.basicConfig(level=logging.INFO) s = `0` n = int(s) logging.info(`n = %d` % n) print(10 / n)
-------------------------------------------- $ python err.py INFO:root:n = 0 Traceback (most recent call last): File "err.py", line 8, in <module> print(10 / n) ZeroDivisionError: division by zero