python學習筆記 錯誤處理

2021-09-17 07:55:17 字數 2856 閱讀 4082

程式中的錯誤處理有多種方式,一類是約定好錯誤碼,然後根據返回的錯誤碼來判斷是否發生錯誤,以及錯誤的原因。

但是這麼做容易將正確的返回值和錯誤碼混在一起,必須要寫很多**來區分,非常不方便。

另外一旦出錯,還需要一級一級往上報,知道有一級可以處理它。

比較成熟的做法是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...