1. 程式人生 > 實用技巧 >【Python】異常

【Python】異常

異常

一. 瞭解異常

當檢測到一個錯誤時,直譯器就無法繼續執行了,反而出現了一些錯誤的提示,這就是所謂的"異常"。
例如:以 r 方式開啟一個不存在的檔案。

open('test.txt', 'r')

二. 異常的寫法

2.1 語法

try:
    可能發生錯誤的程式碼
except:
    如果出現異常執行的程式碼

2.2 快速體驗

需求:嘗試以 r 模式開啟檔案,如果檔案不存在,則以 w 方式開啟。

try:
    f = open('test.txt', 'r')
except:
    f = open('test.txt', 'w')

2.3 捕獲指定異常

2.3.1 語法

try:
    可能發生錯誤的程式碼
except 異常型別:
    如果捕獲到該異常型別執行的程式碼

2.3.2 體驗

try:
    print(num)
except NameError:
    print('有錯誤')

注意:

  1. 如果嘗試執行的程式碼的異常型別和要捕獲的異常型別不一致,則無法捕獲異常。
  2. 一般try下方只放一行嘗試執行的程式碼。

2.3.3 捕獲多個指定異常

當捕獲多個異常時,可以把要捕獲的異常型別的名字,放到except 後,並使用元組的方式進行書寫。

try:
    print(1/0)
except (NameError, ZeroDivisionError):
    print('有錯誤')

2.3.4 捕獲異常描述資訊

try:
    print(num)
except (NameError, ZeroDivisionError) as result:
    print(result)

2.3.5 捕獲所有異常

Exception是所有程式異常類的⽗類。

try:
    print(num)
except Exception as result:
    print(result)

2.4 異常的else

else表示的是如果沒有異常要執行的程式碼。

try:
    print(1)
except Exception as result:
    print(result)
else:
    print('我是else,是沒有異常的時候執⾏的程式碼')

2.5 異常的finally

finally表示的是無論是否異常都要執行的程式碼,例如關閉檔案。

try:
    f = open('test.txt', 'r')
except Exception as result:
    f = open('test.txt', 'w')
else:
    print('沒有異常,真開⼼')
finally:
    f.close()

三. 異常的傳遞

體驗異常傳遞
需求:

  1. 嘗試只讀方式開啟test.txt檔案,如果檔案存在則讀取檔案內容,檔案不存在則提示使用者即可。
  2. 讀取內容要求:嘗試迴圈讀取內容,讀取過程中如果檢測到使用者意外終止程式,則 except 捕獲異常並提示使用者。
import time
try:
    f = open('test.txt')
    try:
        while True:
            content = f.readline()
            if len(content) == 0:
                break
            time.sleep(2)
            print(content)
    except:
        # 如果在讀取⽂件的過程中,產⽣了異常,那麼就會捕獲到
        # ⽐如 按下了 ctrl+c
        print('意外終⽌了讀取資料')
    finally:
        f.close()
        print('關閉⽂件')
except:
    print("沒有這個⽂件")

四. 自定義異常

在Python中,丟擲自定義異常的語法為 raise 異常類物件 。

需求:密碼長度不足,則報異常(使用者輸入密碼,如果輸入的長度不足3位,則報錯,即丟擲自定義異常,並捕獲該異常)。

# ⾃定義異常類,繼承Exception
class ShortInputError(Exception):
    def __init__(self, length, min_len):
        self.length = length
        self.min_len = min_len
    
    # 設定丟擲異常的描述資訊
    def __str__(self):
        return f'你輸⼊的⻓度是{self.length}, 不能少於{self.min_len}個字元'

def main():
    try:
        con = input('請輸⼊密碼:')
        if len(con) < 3:
            raise ShortInputError(len(con), 3)
    except Exception as result:
        print(result)
    else:
        print('密碼已經輸⼊完成')

main()