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