天天看點

python異常處理異常異常的分類異常處理使用者手動引發異常關于自定義異常

異常

  • 廣義上的錯誤分為錯誤和異常
  • 錯誤指的是可以人為避免
  • 異常是指在文法邏輯正确的而前提下,出現的問題
  • 在python中,異常是一個類,可以處理和使用

異常的分類

BaseException 所有異常的基類
Exception 常見錯誤的基類
ArithmeticError 所有數值計算錯誤的基類
Warning 警告的基類

AssertError 斷言語句(assert)失敗
AttributeError 嘗試通路未知的對象屬性
DeprecattionWarning 關于被棄用的特征的警告
EOFError 使用者輸入檔案末尾标志EOF(Ctrl+d)
FloattingPointError 浮點計算錯誤
FutureWarning 關于構造将來語義會有改變的警告
GeneratorExit generator.close()方法被調用的時候
ImportError 導入子產品失敗的時候
IndexError 索引超出序列的範圍
KeyError 字典中查找一個不存在的關鍵字
KeyboardInterrupt 使用者輸入中斷鍵(Ctrl+c)
MemoryError 記憶體溢出(可通過删除對象釋放記憶體)
NamerError 嘗試通路一個不存在的變量
NotImplementedError 尚未實作的方法
OSError 作業系統産生的異常(例如打開一個不存在的檔案)
OverflowError 數值運算超出最大限制
OverflowWarning 舊的關于自動提升為長整型(long)的警告
PendingDeprecationWarning 關于特征會被遺棄的警告
ReferenceError 弱引用(weak reference)試圖通路一個已經被垃圾回收機制回收了的對象
RuntimeError 一般的運作時錯誤
RuntimeWarning 可疑的運作行為(runtime behavior)的警告
StopIteration 疊代器沒有更多的值
SyntaxError Python的文法錯誤
SyntaxWarning 可疑的文法的警告
IndentationError 縮進錯誤
TabError Tab和空格混合使用
SystemError Python編譯器系統錯誤
SystemExit Python編譯器程序被關閉
TypeError 不同類型間的無效操作
UnboundLocalError 通路一個未初始化的本地變量(NameError的子類)
UnicodeError Unicode相關的錯誤(ValueError的子類)
UnicodeEncodeError Unicode編碼時的錯誤(UnicodeError的子類)
UnicodeDecodeError Unicode解碼時的錯誤(UnicodeError的子類)
UserWarning 使用者代碼生成的警告
ValueError 傳入無效的參數
ZeroDivisionError 除數為零

           
l = [1,2,3,4,5]
# 除零錯誤
num = int(input("Please input your num: "))
print(100/num)           
Please input your num: 0



---------------------------------------------------------------------------

ZeroDivisionError                         Traceback (most recent call last)

<ipython-input-1-8abb196ce2aa> in <module>
      2 # 除零錯誤
      3 num = int(input("Please input your num: "))
----> 4 print(100/num)


ZeroDivisionError: division by zero

           

異常處理

  • 不能保證程式永遠正确運作
  • 但是,必須保證程式在最壞的情況下得到的問題被妥善管理
  • python的異常處理子產品全部文法為:
    try:
        嘗試實作某個操作,
        如果沒有出現異常,任務就可以完成
        如果出現異常,将異常從目前代碼塊扔出去嘗試解決異常
    
    except 異常類型1:
        解決方案1:用于嘗試在此處處理異常解決問題
        
    except 異常類型2:
        解決方案2:用于嘗試在此處處理異常解決問題
    
    except (異常類型1,異常類型2...):
        解決方案:針對多個異常使用相同的處理方式
        
    except:
        如果沒有出現任何異常,将會執行此處代碼
    
    finally:
        有沒有異常都要執行的代碼
                   
  • 流程
    1. 執行try下面的語句
    2. 如果出現異常,則在except語句裡查找對應異常病進行處理
    3. 如果沒有出現異常,則執行else語句内容
    4. 最後,不管是否出現異常,都要執行finally語句
  • 除except(最少一個)以外,else和finally可選
# 簡單異常案例
try:
    num = int(input("Please input your number:"))
    rst = 100/num
    print("計算結果是:{}".format(rst))
except:
    print("輸入錯誤")
    # exit是退出程式的意思
    exit()           
Please input your number:0
輸入錯誤


           
# 簡單異常案例
# 給出提示資訊
try:
    num = int(input("Please input your number:"))
    rst = 100/num
    print("計算結果是:{}".format(rst))
# 捕獲異常後,把異常執行個體化,出錯資訊會在執行個體裡
# 注意以下寫法
# 以下語句是捕獲ZeroDivisionError異常并執行個體化執行個體e
except ZeroDivisionError as e:
    print("輸入錯誤")
    print(e)
    # exit是退出程式的意思
    exit()           
# 簡單異常案例
# 給出提示資訊
try:
    num = int(input("Please input your number:"))
    rst = 100/num
    print("計算結果是:{}".format(rst))
# 如果是多種error的情況
# 需要把越具體的錯誤,越往前放
# 在異常類繼承關系中,越是子類的異常,越要往前放,
# 越是父類的異常,越要往後放 、

# 在處理異常的時候,一旦攔截到某一個異常,則不再繼續往下檢視,直接進行下一個
# 代碼,即有finally則執行finally語句,否賊就執行下一個大的語句
except ZeroDivisionError as e:
    print("輸入錯誤")
    print(e)
    # exit是退出程式的意思
    exit()
except NameError as e:
    print("名字起錯了")
    print(e)

except AttributeError as e:
    print("屬性錯誤")
    print(e)
    exit()
# 常見錯誤的基類
# 如果寫下面這句話,常見異常都會攔截住
# 而且下面這句話一定是最後一個excepttion
except Exception as e:
    print("我也不知道就出錯了")
    print(e)

except ValueError as e:
    print("NO>>>>>>>>>>>")
print("hahaha")           
Please input your number:ffff
我也不知道就出錯了
invalid literal for int() with base 10: 'ffff'
hahaha

           

使用者手動引發異常

  • 當某些情況,使用者希望自己引發一個異常的時候,可以使用
  • raise 關鍵字來引發異常
# raise 案例
try:
    print("I love you")
    print(3.1415926)
    # 手動引發一個異常
    # 注意文法:raise ErrorClassName
    raise ValueError
    print("還沒完呀")
except NameError as e:
    print("NameError")
except ValueError as e:
    print("ValueError")
except Exception as e:
    print("有異常")
finally:
    print("我肯定會被執行的")           
I love you
3.1415926
ValueError
我肯定會被執行的


           
# raise 案例-2
# 自定義異常
# 需要注意:自定義異常必須是系統異常的子類
class DanaValueError(ValueError):
    pass

try:
    print("I love you")
    print(3.1415926)
    # 手動引發一個異常
    # 注意文法:raise ErrorClassName
    raise DanaValueError
    print("還沒完呀")
except NameError as e:
    print("NameError")
# except DanaValueError as e:
#    print("DanaError")
except ValueError as e:
    print("ValueError")
except Exception as e:
    print("有異常")
finally:
    print("我肯定會被執行的")           
I love you
3.1415926
ValueError
我肯定會被執行的


           
# else語句案例

try:
    num = int(input("Please input your number:"))
    rst = 100/num
    print("計算結果是:{}".format(rst))
except Exception as e:
    print("Exceptiong")  
    
else:
    print("No Exception")
finally:
    print("反正我會被執行")           
Please input your number:0
Exceptiong
反正我會被執行

           

關于自定義異常

  • 隻要是raise異常,則推薦自定義異常
  • 在自定義異常的時候,一般包含以下内容:
    • 自定義發生異常的異常代碼
    • 自定義發生異常後的問題提示
    • 自定義發生異常的行數
  • 最終的目的是,一旦發生異常,友善程式員快速定位錯誤現場