異常就是執行期檢測到的錯誤。計算機語言針對可能出現的錯誤定義了異常型別,某種錯誤引發對應的異常時,異常處理程式將被啟動,從而恢復程式的正常執行。
異常體系內部有層次關係,python異常體系中的部分關係如下所示:
檢測範圍
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))
出錯了!try: 檢測範圍 except exception[as reason]: 出現異常後的處理** finally: 無論如何都會被執行的**原因是:unsupported operand type(s) for +: 'int' and 'str'
不管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'
result is 2.0如果在executing finally clause
division by zero!
executing finally clause
try
子句執行時沒有發生異常,python將執行else
語句後的語句。
使用try:
檢測範圍
except:
出現異常後的處理**
else:
如果沒有異常執行這塊**
except
而不帶任何異常型別,這不是乙個很好的方式,我們不能通過該程式識別出具體的異常資訊,因為它捕獲所有的異常。
try: 檢測範圍 except(exception1[, exception2[,...exceptionn]]]): 發生以上多個異常中的乙個,執行這塊** else: 如果沒有異常執行這塊**
例子:
輸出:try:
fh = open("testfile.txt", "w")
fh.write("這是乙個測試檔案,用於測試異常!!")
except ioerror:
print("error: 沒有找到檔案或讀取檔案失敗")
else:
print("內容寫入檔案成功")
fh.close()
內容寫入檔案成功注意:
else
語句的存在必須以except
語句的存在為前提,在沒有except
語句的try
語句中使用else
語句,會引發語法錯誤。
python 使用raise
語句丟擲乙個指定的異常。
輸出:try:
raise nameerror('hithere')
except nameerror:
print('an exception flew by!')
an exception flew by!
自學python人臉識別 第三天
小白我今天學到了乙個跟人臉相關的東西了,而且搞了半天終於搞定了。我們先看看效果。這是原圖 這是執行過後的效果圖 對於小白我來說,感覺很酷,畢竟在自學的路上又更進了一步。接下來我們來看看是如何實現的,import cv2 像這裡的haarcascade frontalface default.xml和...
WebGL自學筆記第三天
建立緩衝區物件 gl.createbuffer 繫結緩衝區物件 gl.bindbuffer 將資料寫入緩衝區物件 gl.bufferdata 將緩衝區物件分配給乙個attribute變數 gl.vertexattribpointer 開啟attribute變數 gl.enablevertexattr...
自學php 第三天 讀寫檔案
這次的例子是把訂單的資料儲存起來,一般是用資料庫來進行資料的儲存最好,但是今天目的是為了學習讀寫檔案,所以這次把資料存在檔案裡。讀寫檔案有一般有三個步驟 1 開啟檔案。如果檔案不存在,需要先建立它。2 讀取 寫入資料。3 關閉檔案。1.使用fopen 開啟檔案。fp fopen document r...