程式中的錯誤處理有多種方式,一類是約定好錯誤碼,然後根據傳回的錯誤碼來判斷是否發生錯誤,以及錯誤的原因。
但是這麼做容易將正確的回傳值和錯誤碼混在一起,必須要寫很多程式碼來區分,非常不方便。另外一旦出錯,還需要一級一級往上報,知道有一級可以處理它。
比較成熟的做法是try...except...finally...這套錯誤處理機轉。此機制不會幹擾正常的回傳值。同時也無需一級一級手動上報,而是只需要有一級捕獲並處理即可。
程式碼:
try: print open("Demo.py", 'r') n = 1 / 0 except ZeroDivisionError, e: print "zeroDivisionError", e except ValueError, e: print "ValueError", e else: print "No Error catched" finally: print "finally"
使用錯誤處理有幾個點需要注意:
可以寫多個except用於捕獲多個exception
ception類
,已經被捕獲的exception不會再傳遞給其他exception。
可以用else來處理沒有exeption的情況
finally是無論有沒有錯誤都會執行。
Python(2.x)內建Exception的繼承關係請見下圖:
The class hierarchy for built-in exceptions is: BaseException +-- SystemExit +-- KeyboardInterrupt +-- GeneratorExit +-- Exception +-- StopIteration +-- StandardError | +-- BufferError | +-- ArithmeticError | | +-- FloatingPointError | | +-- OverflowError | | +-- ZeroDivisionError | +-- AssertionError | +-- AttributeError | +-- EnvironmentError | | +-- IOError | | +-- OSError | | +-- WindowsError (Windows) | | +-- VMSError (VMS) | +-- EOFError | +-- ImportError | +-- LookupError | | +-- IndexError | | +-- KeyError | +-- MemoryError | +-- NameError | | +-- UnboundLocalError | +-- ReferenceError | +-- RuntimeError | | +-- NotImplementedError | +-- SyntaxError | | +-- IndentationError | | +-- TabError | +-- SystemError | +-- TypeError | +-- ValueError | +-- UnicodeError | +-- UnicodeDecodeError | +-- UnicodeEncodeError | +-- UnicodeTranslateError +-- Warning +-- DeprecationWarning +-- PendingDeprecationWarning +-- RuntimeWarning +-- SyntaxWarning +-- UserWarning +-- FutureWarning +-- ImportWarning +-- UnicodeWarning +-- BytesWarning
當然我們也可以推薦一個類,例如:
class MyException(StandardException):
raise MyException("this is my Exception")
rrreee
在測試程式碼中,我們對Exception的處理中可以直接print exception。但是實際生產代碼中直接列印log可能不是很妥。我們可以透過簡單的配置使用logging.exception(msg)將錯誤列印到日誌中。如何正確使用python內建的logging模組,可以另開一篇文章介紹。 以上就是python學習筆記-錯誤處理的內容,更多相關內容請關注PHP中文網(www.php.cn)!