程式中的錯誤處理有多種方式,一類是約定好錯誤碼,然後根據返回的錯誤碼來判斷是否發生錯誤,以及錯誤的原因。
但是這麼做容易將正確的返回值和錯誤碼混在一起,必須要寫很多**來區分,非常不方便。
另外一旦出錯,還需要一級一級往上報,知道有一級可以處理它。
比較成熟的做法是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
父類exception可以捕獲子類的exception,已經**獲的exception不會再被傳遞給其他exception。
可以用else來處理沒有exeption的情況
finally是無論有無錯誤都會執行。
build-in exception的種類
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):
pass
當然,推薦使用build-in的exception。在build-in的exception中找不到我們所需要的exception的時候,我們才自定義exception。
拋出自定義exception使用以下語法:
raise myexception("this is my exception")
在測試**中,我們對exception的處理中可以直接print exception。但是實際生產**中直接列印log可能不是很妥。我們可以通過簡單的配置使用logging.exception(msg)將錯誤列印到日誌中。
如何正確使用python內建的logging模組,可以另開一篇文章介紹。
Swift學習筆記 錯誤處理
錯誤分為可恢復的錯誤和不可恢復的錯誤,可恢復的錯誤指的是能預見並處理的錯誤,例如檔案不存在,網路連線失敗等 不可恢復的錯誤指的是一類特殊的bug,例如強制展開值為nil的可空例項,陣列越界訪問等 如果發生錯誤沒有處理,程式就會停止執行。遺憾的是swift中似乎只能處理可恢復的錯誤。swift中使用a...
rust學習筆記 錯誤處理
rust的錯誤分兩種 rust提供了可恢復錯誤的型別result t,e 與不可恢復錯誤時終止執行的panic!巨集。程式會在panic!巨集執行時列印出一段錯誤提示資訊,展開並清理當前的呼叫棧,然後退出程式,這種情況大部分都發生在某個錯誤被檢測到,但程式設計師卻不知道該如何處理的時候。panic的...
Windows開發筆記 錯誤處理
windows函式為開發者提供了錯誤 這樣當呼叫windows函式失敗後,可以通過檢視錯誤 了解錯誤資訊。相應的錯誤與主調執行緒關聯在一起,這種機制使得不同的執行緒能夠獨立執行而不會相互干擾。呼叫getlasterror 檢視錯誤 windows提供的錯誤 很多,相應的標頭檔案是winerror.h...