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