python基礎 Task 3 異常處理

2021-10-08 12:49:49 字數 4907 閱讀 7879

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

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,但由於keyerrorlookuperror的子類,且將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語句,會引發語法錯誤。

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

【例子】

try:

raise nameerror('hithere')

except nameerror:

print('an exception flew by!')

# an exception flew by!

練習題

1、猜數字遊戲

題目描述:

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

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

獲取隨機數採用random模組。

import random

secret = random.randint(1,100) #[1,100]之間的隨機數

i = 1

while true:

print('這是第%d次猜測'%i)

try:

temp = input("請輸入數字:")

guess = int(temp)

except valueerror:

print('輸入錯誤,請輸入1-100之間的數字')

else:

if guess > secret:

print("太大了")

else:

if guess == secret:

print("恭喜你猜中了,這個數是:%d"%secret)

break

else:

print("太小了")

i += 1

print("end")

————————————————

TASK3 異常處理

try 檢測範圍 except exception as reason 出現異常後的處理 首先執行try語句,若沒有異常發生則執行完try語句後結束,若發生異常,try語句中的其他語句將被忽略,異常型別與except中相符則執行except後的語句,不相符則上傳給上層的try語句。try 檢測範圍 ...

Task 3 異常處理

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

python打卡 Task 3異常處理

try except 語句 try 檢測範圍 except exception as reason 出現異常後的處理 try except finally 語句 try 檢測範圍 except exception as reason 出現異常後的處理 finally 無論如何都會被執行的 try e...