Python的異常和異常處理----17
阿新 • • 發佈:2019-01-04
異常
- 錯誤和異常
- 錯誤指的是可以人為避免的
- 異常是指在語法邏輯正確的情況下,出現問題
- 在Python中,異常是一個類,可以處理和使用
- 異常的分類
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 使用者程式碼生成的警告
異常處理
- 不能保證程式碼永遠正確執行
- 但是,必須保證程式在最壞的情況下得到的問題被妥善處理
- Python的異常處理模組全部語法為:
try: <語句> #執行別的程式碼 except <名字>: <語句> #如果在try部份引發了'name'異常 expect (異常型別1,異常型別2,...) 解決多個異常使用相同的處理 except <名字>,<資料>: <語句> #如果引發了'name'異常,獲得附加的資料 else: <語句> #如果沒有異常發生 finally: 不管有沒有異常都要執行的程式碼
- 流程
- 執行try下面的語句
- 如果出現異常,則在except語句中查詢對應的異常並進行相應的處理
- 如果沒有出現異常,則執行else語句內容
- 最後,不管是否出現異常,都要執行finally語句
- 除except(最少一個)以外,else和finally可選
In [12]:
# 簡單案例
try:
num = int(input('Please input your number:'))
rst = 100 / num
print('估計結果是:{0}'.format(rst))
except:
print('輸入錯誤')
#exit 是退出程式的意思
exit()
Please input your number:0 輸入錯誤
In [1]:
# 簡單案例
#給出提示資訊
try:
num = int(input('Please input your number:'))
rst = 100 / num
print('估計結果是:{0}'.format(rst))
#捕獲異常資訊,把異常例項化
#以下語句是捕獲ZeroDivisionError異常並例項化例項
except ZeroDivisionError as e:
print(e)
#exit 是退出程式的意思
exit()
Please input your number:0 division by zero
In [1]:
# 簡單案例
#給出提示資訊
try:
num = int(input('Please input your number:'))
rst = 100 / num
prnt('估計結果是:{0}'.format(rst))
#如果是多種error的情況
#需要把越具體的錯誤,越往前放
#在處理異常的時候,一旦攔截到某一個異常,則不在繼續往下查,直接進行下一個程式碼
#即有finally則執行finally語句塊,否則執行下一個大的語句塊
except ZeroDivisionError as e:
print(e)
#exit 是退出程式的意思
except NameError as e:
print('名字錯了')
print(e)
#所有錯誤都繼承自Exception
#出現那種錯誤都會攔截
#而且這段程式碼一定是最後一個except
except Exception as e:
print('不知道錯哪')
exit()
print('hahahah')
Please input your number:aa 不知道錯哪 hahahah
使用者手動引發異常
- 某些情況,使用者希望自己引發一個異常
- raise 關鍵字來引發異常
In [2]:
#raise案例--1
try :
print('hahahaha')
print(3.123445)
#手動引發異常
#注意語法:raise ErrorClassName
raise ValueError #手動觸點發ValueError
print('還沒結束')
except NameError as e:
print('NameError')
except ValueError as e:
print('ValueError')
except Exception as e:
print('不知道錯哪')
finally:
print('我執行了')
hahahaha 3.123445 ValueError 我執行了
In [8]:
#raise案例--2
#自己定義異常
#注意:自定義異常必須是系統異常的子類
class DanaValueError(ValueError):
pass
try :
print('hahahaha')
print(3.123445)
#手動引發異常
#注意語法:raise ErrorClassName
raise DanaValueError #手動觸點發ValueError
print('還沒結束')
except NameError as e:
print('NameError')
except DanaValueError as e:
print('是大拿錯了')
except ValueError as e:
print('ValueError')
except Exception as e:
print('不知道錯哪')
finally:
print('我執行了')
hahahaha 3.123445 是大拿錯了 我執行了
In [11]:
# else語句案例
try:
num = int(input('Please input your number:'))
rst = 100 / num
print('估計結果是:{0}'.format(rst))
except Exception as e:
print('不知道錯哪')
else :
print('沒有錯誤')
finally:
print('執行了')
Please input your number:20 估計結果是:5.0 沒有錯誤 執行了
關於自定義的異常
- 只要是raise異常,則推薦自定義
- 在自定義異常的時候,一般包含以下內容:
- 自定義發生異常的程式碼
- 自定義發生異常後的問題提示
- 自定義發生異常的行數
- 目的:程式碼發生錯誤時,方便程式設計師找錯