標籤:sys 不同的 對齊 display 個人 lookup style 表達 long
第一:什麼是異常
異常即是一個事件,該事件會在程式執行過程中發生,影響了程式的正常執行。
在python中不同的異常可以用不同的類型(python中統一了類與類型,類型即類)去標識,不同的類對象標識不同的異常,一個異常標識一種錯誤
常見的異常:
AttributeError 試圖訪問一個對象沒有的樹形,比如foo.x,但是foo沒有屬性xIOError 輸入/輸出異常;基本上是無法開啟檔案ImportError 無法引入模組或包;基本上是路徑問題或名稱錯誤IndentationError 語法錯誤(的子類) ;代碼沒有正確對齊IndexError 下標索引超出序列邊界,比如當x只有三個元素,卻試圖訪問x[5]KeyError 試圖訪問字典裡不存在的鍵KeyboardInterrupt Ctrl+C被按下NameError 使用一個還未被賦予對象的變數SyntaxError Python代碼非法,代碼不能編譯(個人認為這是語法錯誤,寫錯了)TypeError 傳入物件類型與要求的不符合UnboundLocalError 試圖訪問一個還未被設定的局部變數,基本上是由於另有一個同名的全域變數,導致你以為正在訪問它ValueError 傳入一個調用者不期望的值,即使值的類型是正確的
標準異常:
BaseException 所有異常的基類SystemExit 解譯器請求退出KeyboardInterrupt 使用者中斷執行(通常是輸入^C)Exception 常規錯誤的基類StopIteration 迭代器沒有更多的值GeneratorExit 產生器(generator)發生異常來通知退出StandardError 所有的內建標準異常的基類ArithmeticError 所有數值計算錯誤的基類FloatingPointError 浮點計算錯誤OverflowError 數值運算超出最大限制ZeroDivisionError 除(或模數)零 (所有資料類型)AssertionError Assert 陳述式失敗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 使用者代碼產生的警告
標準異常第二:錯誤
錯誤一般分為兩種:
語法錯誤:這種錯誤不能繼續往下啟動並執行:
eg:1.沒有對齊
2.python3中print沒有加括弧
等等
邏輯錯誤:eg:
res=1+str(2)
第三:異常處理
寫在前言:異常是由程式的錯誤引起的,文法上的錯誤跟異常處理無關,必須在程式運行前就修正
python解析器去執行程式,檢測到了一個錯誤時,觸發異常,異常觸發後且沒被處理的情況下,程式就在當前異常處終止,後面的代碼不會運行,誰會去用一個運行著突然就崩潰的軟體。
捕捉異常可以使用try/except語句。
try/except語句用來檢測try語句塊中的錯誤,從而讓except語句捕獲異常資訊並處理。
如果你不想在異常發生時結束你的程式,只需在try裡捕獲它。
文法:
以下為簡單的try....except...else的文法:
try:<語句> #運行別的代碼except <名字>:<語句> #如果在try部份引發了‘name‘異常except <名字>,<資料>:<語句> #如果引發了‘name‘異常,獲得附加的資料
如果當try後的語句執行時發生異常,python就跳回到try並執行第一個匹配該異常的except子句,異常處理完畢,控制流程就通過整個try語句(除非在處理異常時又引發新的異常)。
如果在try後的語句裡發生了異常,卻沒有匹配的except子句,異常將被遞交到上層的try,或者到程式的最上層(這樣將結束程式,並列印預設的出錯資訊)。
如果在try子句執行時沒有發生異常,python將執行else語句後的語句(如果有else的話),然後控制流程通過整個try語句。
eg:基本文法:
try: fh = open("test", "w") fh.write("這是一個測試檔案,用於測試異常!!")except IOError: print "Error: 沒有找到檔案或讀取檔案失敗"else: print "內容寫入檔案成功" fh.close()
異常類處理指定的異常(如果沒有捕捉到,直接報錯):
try: print(e)except NameError as e: print(e)輸出結果:name ‘e‘ is not defined
多分支異常
d={‘a‘,1}try: print(d[‘b‘])except NameError as e: print(e)except TypeError as e: print(e)輸出結果:‘set‘ object is not subscriptable
萬能異常
d={‘a‘,1}try: print(c) print(d[‘b‘])except Exception as e: print(e)輸出結果:name ‘c‘ is not definedd={‘a‘,1}try: print(d[‘b‘]) print(c)except Exception as e: print(e)輸出結果:‘set‘ object is not subscriptable
else和finally
s1 = ‘hello‘try: int(s1)except IndexError as e: print(e)except KeyError as e: print(e)except ValueError as e: print(e)except Exception as e: print(e)else: print(‘try內代碼塊沒有異常則執行我‘)finally: print(‘無論異常與否,都會執行該模組,通常是進行清理工作‘)# 輸出結果:# invalid literal for int() with base 10: ‘hello‘# 無論異常與否,都會執行該模組,通常是進行清理工作
自己挑起異常,想在哪裡有異常就在哪裡挑起異常
try: raise NameError(‘未被賦值的對象‘)except NameError as e: print(e) 輸出結果:未被賦值的對象
第四:自訂異常
class zzlException(BaseException): def __init__(self,msg): self.msg=msg def __str__(self): return self.msgtry: raise zzlException(‘error‘)except zzlException as e: print(e) 輸出結果:error
第五:斷言
assert的異常參數,其實就是在斷言運算式後添加字串資訊,用來解釋斷言並更好的知道是哪裡出了問題 assert 2==1 assert 3==3
python之異常處理