python學習 04 異常處理

2021-10-08 12:47:41 字數 4564 閱讀 9545

異常就是執行期檢測到的錯誤。計算機語言針對可能出現的錯誤定義了異常型別,某種錯誤引發對應的異常時,異常處理程式將被啟動,從而恢復程式的正常執行。

try

: 檢測範圍

except exception[

as reason]

: 出現異常後的處理**

try 語句按照如下方式工作:

try

: f =

open

('test.txt'

)print

(f.read())

f.close(

)except oserror:

print

('開啟檔案出錯'

)# 開啟檔案出錯

【例子】

try

: f =

open

('test.txt'

)print

(f.read())

f.close(

)except oserror as error:

print

('開啟檔案出錯\n原因是:'

+str

(error)

)# 開啟檔案出錯

# 原因是:[errno 2] no such file or directory: 'test.txt'

乙個try語句可能包含多個except子句,分別來處理不同的特定的異常。最多只有乙個分支會被執行。

【例子】

try

:int

("abc"

) s =1+

'1' f =

open

('test.txt'

)print

(f.read())

f.close(

)except oserror as error:

print

('開啟檔案出錯\n原因是:'

+str

(error)

)except typeerror as error:

print

('型別出錯\n原因是:'

+str

(error)

)except valueerror as error:

print

('數值出錯\n原因是:'

+str

(error)

)# 數值出錯

# 原因是:invalid literal for int() with base 10: 'abc'

【例子】

dict1 =

try:

x = dict1[

'y']

except lookuperror:

print

('查詢錯誤'

)except keyerror:

print

('鍵錯誤'

)else

:print

(x)# 查詢錯誤

try-except-else語句嘗試查詢不在dict中的鍵值對,從而引發了異常。這一異常準確地說應屬於keyerror,但由於keyerror是lookuperror的子類,且將lookuperror置於keyerror之前,因此程式優先執行該except**塊。所以,使用多個except**塊時,必須堅持對其規範排序,要從最具針對性的異常到最通用的異常。

【例子】

dict1 =

try:

x = dict1[

'y']

except keyerror:

print

('鍵錯誤'

)except lookuperror:

print

('查詢錯誤'

)else

:print

(x)# 鍵錯誤

【例子】乙個 except 子句可以同時處理多個異常,這些異常將被放在乙個括號裡成為乙個元組。

try

: s =1+

'1'int

("abc"

) f =

open

('test.txt'

)print

(f.read())

f.close(

)except

(oserror, typeerror, valueerror)

as error:

print

('出錯了!\n原因是:'

+str

(error)

)# 出錯了!

# 原因是:unsupported operand type(s) for +: 'int' and 'str'

try

: 檢測範圍

except exception[

as reason]

: 出現異常後的處理**

finally

: 無論如何都會被執行的**

不管try子句裡面有沒有發生異常,finally子句都會執行。

如果乙個異常在try子句裡被丟擲,而又沒有任何的except把它截住,那麼這個異常會在finally子句執行後被丟擲。

【例子】

def

divide

(x, y)

:try

: result = x / y

print

("result is"

, result)

except zerodivisionerror:

print

("division by zero!"

)finally

:print

("executing finally clause"

)divide(2,

1)# result is 2.0

# executing finally clause

divide(2,

0)# division by zero!

# executing finally clause

divide(

"2",

"1")

# executing finally clause

# typeerror: unsupported operand type(s) for /: 'str' and 'str'

如果在try子句執行時沒有發生異常,python將執行else語句後的語句。

try

: 檢測範圍

except

: 出現異常後的處理**

else

: 如果沒有異常執行這塊**

使用except而不帶任何異常型別,這不是乙個很好的方式,我們不能通過該程式識別出具體的異常資訊,因為它捕獲所有的異常。

try

: 檢測範圍

except

(exception1[

, exception2[,.

..exceptionn]]]

):發生以上多個異常中的乙個,執行這塊**

else

: 如果沒有異常執行這塊**

【例子】

try

: fh =

open

("testfile"

,"w"

) fh.write(

"這是乙個測試檔案,用於測試異常!!"

)except ioerror:

print

("error: 沒有找到檔案或讀取檔案失敗"

)else

:print

("內容寫入檔案成功"

) fh.close(

)# 內容寫入檔案成功

注意:else語句的存在必須以except語句的存在為前提,在沒有except語句的try語句中使用else語句,會引發語法錯誤。

raise語句

python 使用raise語句丟擲乙個指定的異常。

【例子】

try

:raise nameerror(

'hithere'

)except nameerror:

print

('an exception flew by!'

)# an exception flew by!

練習題:

1、猜數字遊戲

題目描述:

電腦產生乙個零到100之間的隨機數字,然後讓使用者來猜,如果使用者猜的數字比這個數字大,提示太大,否則提示太小,當使用者正好猜中電腦會提示,「恭喜你猜到了這個數是…」。在使用者每次猜測之前程式會輸出使用者是第幾次猜測,如果使用者輸入的根本不是乙個數字,程式會告訴使用者"輸入無效"。

(嘗試使用try catch異常處理結構對輸入情況進行處理)

獲取隨機數採用random模組。

04 異常處理規範

異常處理類似程式的預警機制,當程式出現了異常狀態時,開發者可以使用已經設計好的異常處理 將異常排除,確保程式穩定執行。但如果異常處理使用不當,不僅不會解決問題,還會嚴重影響程式的執行效率。本節將介紹一些基本的異常處理規範。catch語句的大括號內必須有異常處理語句,不要不寫任何 反例 trycatc...

Python學習 異常處理

assertionerror 斷言語句失敗 assertionerror 斷言語句失敗,一般是在測試程式時置入檢查點 my list love my list.pop assert len my list 0 traceback most recent call last file line 1,i...

python學習 異常處理

class myerror exception definit self,msg self.msg msg defstr self return str self.msg 777 try 檢測try語句塊中的錯誤 print 2 0 raise myerror 主動丟擲錯誤 except myerr...