Python的異常處理
阿新 • • 發佈:2022-03-26
1.異常
- 異常是指在語法正確的前提下,程式執行時報錯就是異常。
- 當Python指令碼發生異常時我們需要捕獲處理它,否則程式會終止執行
2.異常型別
異常 | 描述 |
---|---|
BaseException | 所有異常的基類 |
SystemExit | 直譯器請求退出 |
KeyboardInterrupt | 使用者中斷執行(通常是輸入^C) |
Exception | 常規錯誤的基類 |
StopIteration | 迭代器沒有更多的值 |
GeneratorExit | 生成器(generator)發生異常來通知退出 |
StandardError | 所有的內建標準異常的基類 |
ArithmeticError |
所有數值計算錯誤的基類 |
FloatingPointError | 浮點計算錯誤 |
OverflowError | 數值運算超出最大限制 |
ZeroDivisionError | 除(或取模)零 (所有資料型別) |
AssertionError | 斷言語句失敗 |
AttributeError | 物件沒有這個屬性 |
EOFError | 沒有內建輸入,到達EOF 標記 |
EnvironmentError | 作業系統錯誤的基類 |
IOError | 輸入/輸出操作失敗 |
OSError | 作業系統錯誤 |
WindowsError | 系統呼叫失敗 |
ImportError | 匯入模組/物件失敗 |
LookupError |
無效資料查詢的基類 |
IndexError | 序列中沒有此索引(index) |
KeyError | 對映中沒有這個鍵 |
MemoryError | 記憶體溢位錯誤(對於Python 直譯器不是致命的) |
NameError | 未宣告/初始化物件 (沒有屬性) |
UnboundLocalError | 訪問未初始化的本地變數 |
ReferenceError | 弱引用(Weak reference)試圖訪問已經垃圾回收了的物件 |
RuntimeError | 一般的執行時錯誤 |
NotImplementedError | 尚未實現的方法 |
SyntaxError | Python 語法錯誤 |
IndentationError |
縮排錯誤 |
TabError | Tab 和空格混用 |
SystemError | 一般的直譯器系統錯誤 |
TypeError | 對型別無效的操作 |
ValueError | 傳入無效的引數 |
UnicodeError | Unicode 相關的錯誤 |
UnicodeDecodeError | Unicode 解碼時的錯誤 |
UnicodeEncodeError | Unicode 編碼時錯誤 |
UnicodeTranslateError | Unicode 轉換時錯誤 |
Warning | 警告的基類 |
DeprecationWarning | 關於被棄用的特徵的警告 |
FutureWarning | 關於構造將來語義會有改變的警告 |
OverflowWarning | 舊的關於自動提升為長整型(long)的警告 |
PendingDeprecationWarning | 關於特性將會被廢棄的警告 |
RuntimeWarning | 可疑的執行時行為(runtime behavior)的警告 |
SyntaxWarning | 可疑的語法的警告 |
UserWarning | 使用者程式碼生成的警告 |
3.異常捕獲
try:
pass(可能出現異常的程式碼)
except:
如果有異常執行程式碼
情況一:
try:
有可能產生多種異常
except 異常型別1:
print(...)
expect 異常型別2:
print(...)
......(可跟多個異常)
except Exception:(如果上面異常都沒有,則會進入這個異常)
print('出錯咯‘)(接納所有可能出錯的異常)
如果是多個except,異常型別的順序需要注意,最大的Exception要放到最後
1 def func():
2 try:
3 n1 = int(input('請輸入一個數字:'))
4 n2 = int(input('請輸入一個數字:'))
5 per = input('輸入運算子(+ — * /):')
6 result = 0
7 if per == '+':
8 result = n1 + n2
9 elif per == '-':
10 result = n1 - n2
11 elif per == '*':
12 result = n1 * n2
13 elif per == '/':
14 result = n1 / n2
15 else:
16 print('輸入錯誤!')
17 print(result)
18 with open(r'E:\book\aa.txt', 'r') as wstream:
19 print(wstream.read())
20 except ZeroDivisionError:
21 print('除數不能為零!')
22 except ValueError:
23 print('必須輸入數字!')
24 except Exception:
25 print('出錯咯!')
26
27
28 func()
情況二:獲取Exception的錯誤原因
try:
有可能產生多種異常
except 異常型別1:
print(...)
expect 異常型別2:
print(...)
......(可跟多個異常)
except Exception as err:
print('出錯咯‘,err)(err的內容就是錯誤原因)
1 def func():
2 try:
3 n1 = int(input('請輸入一個數字:'))
4 n2 = int(input('請輸入一個數字:'))
5 per = input('輸入運算子(+ — * /):')
6 result = 0
7 if per == '+':
8 result = n1 + n2
9 elif per == '-':
10 result = n1 - n2
11 elif per == '*':
12 result = n1 * n2
13 elif per == '/':
14 result = n1 / n2
15 else:
16 print('輸入錯誤!')
17 print(result)
18 with open(r'E:\book\aa.txt', 'r') as wstream:
19 print(wstream.read())
20 except ZeroDivisionError:
21 print('除數不能為零!')
22 except ValueError:
23 print('必須輸入數字!')
24 except Exception as err:
25 print('出錯咯!', err)
26
27
28 func()
情況三:
try:
有可能產生多種異常
except 異常型別1:
print(...)
expect 異常型別2:
print(...)
......(可跟多個異常)
else:
如果程式碼try中沒有發生異常則進入的程式碼
注意: 如果使用else則在try...except程式碼中就不能出現return,否則就提前終止
1 def func():
2 try:
3 n1 = int(input('請輸入一個數字:'))
4 print(n1)
5 return 1
6 except Exception as err:
7 print('出錯咯!', err)
8 return 2
9 else:
10 print('程式碼執行完畢')
11 return 3
12
13
14 func()
15
16 '''
17 請輸入一個數字:1
18 1
19 (else中的程式碼沒有執行)
20 '''
情況四:多在檔案處理的關閉檔案(close())和資料庫的關閉
try:
有可能產生多種異常
except 異常型別1:
print(...)
expect 異常型別2:
print(...)
......(可跟多個異常)
finally:
pass(無論是否存在異常都會執行的程式碼)釋放資源
1 def func():
2 stream = None
3 try:
4 stream = open(r'E:\book\books.txt', 'r', encoding='utf-8')
5 container = stream.read()
6 print(container)
7 except Exception as err:
8 print(err)
9 finally:
10 print('--------finally----------')
11 if stream:
12 stream.close()
13
14
15 func()
16
17 '''
18 正常情況下:
19 水滸傳
20 三國演義
21 紅樓夢
22 水滸傳
23 誅仙
24 --------finally----------
'''
刪除books.txt檔案之後:
[Errno 2] No such file or directory: 'E:\\book\\book.txt'
--------finally----------
'''
1 def func(): 2 stream = None 3 try: 4 stream = open(r'E:\book\books.txt', 'r', encoding='utf-8') 5 container = stream.read() 6 print(container) 7 return 1 8 except Exception as err: 9 print(err) 10 return 2 11 finally: 12 print('--------finally----------') 13 if stream: 14 stream.close() 15 return 3 16 17 18 x = func() 19 print(x)
'''
水滸傳
三國演義
紅樓夢
水滸傳
誅仙
王者榮耀
--------finally----------
3
說明:如果前面的try沒有錯誤,返回值為1,但是經過後面有返回值,則會將前面的返回值覆蓋,最後返回3
'''
4.丟擲異常:raise
格式:
raise 異常型別('提示資訊')
1 def register():
2 username = input('輸入使用者名稱:')
3 if len(username) < 6:
4 raise Exception('使用者名稱長度必須6位以上')手動定義異常
5 else:
6 print('輸入使用者名稱:', username)
7
8
9 try:
10 register()
11 except Exception as err:
12 print(err) # 接收往外扔的異常
13 print('註冊失敗')
14 else:
15 print('註冊成功')
16 '''
17 輸入使用者名稱:admin
18 使用者名稱長度必須6位以上
19 註冊失敗
20 '''
21 '''
22 輸入使用者名稱:Ambitious
23 輸入使用者名稱: Ambitious
24 註冊成功
25 '''