編程須知:Python異常知多少以及如何處理?
本文主要是認識python的異常有哪些類型,以及如何進行python異常處理?有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。如果有其它編程語言經(jīng)驗,如Java,可以理解的更深入些。
我們知道,異常處理,是編程語言或計算機硬件里的一種機制,用于處理軟件或信息系統(tǒng)中出現(xiàn)的異常狀況(即超出程序正常執(zhí)行流程的某些特殊條件),現(xiàn)代編程語言都有這種保證機制,以保證程序整體的運行穩(wěn)健……廢話少說,來看看Python的異常以及相關處理。
1.異常的類型
異常的類型多種多樣,常見的異常有:
AttributeError 試圖訪問一個對象沒有的屬性,比如foo.x,但是foo沒有屬性xIOError 輸入/輸出異常;基本上是無法打開文件ImportError 無法引入模塊或包;基本上是路徑問題或名稱錯誤IndentationError 語法錯誤(的子類) ;代碼沒有正確對齊IndexError 下標索引超出序列邊界,比如當x只有三個元素,卻試圖訪問x[5]KeyError 試圖訪問字典里不存在的鍵KeyboardInterrupt Ctrl+C被按下NameError 嘗試訪問一個沒有申明的變量SyntaxError Python代碼非法,代碼不能編譯(個人認為這是語法錯誤,寫錯了)TypeError 傳入對象類型與要求的不符合UnboundLocalError 試圖訪問一個還未被設置的局部變量,基本上是由于另有一個同名的全局變量,導致你以為正在訪問它ValueError 傳入一個調用者不期望的值,即使值的類型是正確的
其他的異常:
Exception可以捕獲任意異常
BaseException 所有異常的基類SystemExit 解釋器請求退出KeyboardInterrupt 用戶中斷執(zhí)行(通常是輸入^C)Exception 常規(guī)錯誤的基類StopIteration 迭代器沒有更多的值GeneratorExit 生成器(generator)發(fā)生異常來通知退出StandardError 所有的內(nèi)建標準異常的基類ArithmeticError 所有數(shù)值計算錯誤的基類FloatingPointError 浮點計算錯誤OverflowError 數(shù)值運算超出最大限制ZeropisionError 除(或取模)零 (所有數(shù)據(jù)類型)AssertionError 斷言語句失敗AttributeError 對象沒有這個屬性EOFError 沒有內(nèi)建輸入,到達EOF 標記EnvironmentError 操作系統(tǒng)錯誤的基類IOError 輸入/輸出操作失敗OSError 操作系統(tǒng)錯誤WindowsError 系統(tǒng)調用失敗ImportError 導入模塊/對象失敗LookupError 無效數(shù)據(jù)查詢的基類IndexError 序列中沒有此索引(index)KeyError 映射中沒有這個鍵MemoryError 內(nèi)存溢出錯誤(對于Python 解釋器不是致命的)NameError 未聲明/初始化對象 (沒有屬性)UnboundLocalError 訪問未初始化的本地變量ReferenceError 弱引用(Weak reference)試圖訪問已經(jīng)垃圾回收了的對象RuntimeError 一般的運行時錯誤NotImplementedError 尚未實現(xiàn)的方法SyntaxError Python 語法錯誤IndentationError 縮進錯誤TabError Tab 和空格混用SystemError 一般的解釋器系統(tǒng)錯誤TypeError 對類型無效的操作ValueError 傳入無效的參數(shù)UnicodeError Unicode 相關的錯誤UnicodeDecodeError Unicode 解碼時的錯誤UnicodeEncodeError Unicode 編碼時錯誤UnicodeTranslateError Unicode 轉換時錯誤Warning 警告的基類DeprecationWarning 關于被棄用的特征的警告FutureWarning 關于構造將來語義會有改變的警告OverflowWarning 舊的關于自動提升為長整型(long)的警告PendingDeprecationWarning 關于特性將會被廢棄的警告RuntimeWarning 可疑的運行時行為(runtime behavior)的警告SyntaxWarning 可疑的語法的警告UserWarning 用戶代碼生成的警告
2.捕獲異常,處理異常
只有將對應的異常類型捕獲才能進行異常的處理
異常的捕獲處理方式:
- try:
- #程序執(zhí)行的代碼,異常檢測的代碼
- pass
- except Exception as e:
- #捕獲異常后進行的代碼,
- print(e)
- pass
- else:
- #沒有捕獲到相應的異常后進行的代碼
- pass
- finally:
- #不論有沒有異常捕獲最后都要執(zhí)行的代碼
- pass
這里的except就像是java里的catch
也可以在代碼中添加多個except語句來捕獲不同種類型的異常,執(zhí)行相應不同的操作
3.主動拋出異常
異常的拋出可以手動添加
- try:
- raise Exception("我自己拋的")
- except Exception as e:
- print(e)#這里會輸出“我自己拋的”
4.自定義異常類型
在實際編程中,語言內(nèi)置的異常并不總夠用,所有,我們可以自己定義自己所需要的異常的類型。可以這樣來實現(xiàn)。
主要利用類中的__str__方法實現(xiàn)
- class myException(BaseException):
- def __init__(self,message):
- self.message=message
- def __str__(self):
- return self.message
- try:
- raise myException('自定義的異常類型')
- except myException as e:
- print(e)
5.斷言
斷言assert用于判斷某個條件是否成立,如果不成立則拋出AssertionError異常,該異常可以捕獲。
示例如下:
- assert 條件
- 類如:
- assert 1 == 1
- assert 2 + 2 == 2 * 2
- assert len(['my list', 12]) < 10
- assert range(3) == [0, 1, 2]
- #相當于
- if not 條件 :
- raise AssertionError()
- assert 條件,"描述"
- #相當于
- if not 條件 :
- raise AssertionError("描述")
下面是我們?nèi)绾斡?try-except 語句捕獲 AssertionError 異常:
- try:
- assert 1 == 0, 'One does not equal zero silly!'
- except AssertionError, args:
- print(args.__class__.__name__, ":",args)
以上就是python的異常以及相關處理。相信你在進行Python編程時,若有異常問題,以上內(nèi)容,足以幫助你來處理啦。