天天看點

python 異常

異常

異常是一個事件,該事件會在程式執行過程中發生,會影響程式的正常執行

一般情況下,python無法正常處理程式時就會發生一個異常

異常是python的對象,表示一個錯誤

異常處理

當python腳本發生異常時,我們需要捕獲并處理它,否則程式就會終止運作

捕獲異常

可以使用try/except語名

try 語句用來檢測try語句塊中的錯誤

except 語句捕獲異常資訊并對其時行處理

文法

try:
    '需要檢測的代碼'
except <ecxept 1>
    '如果try部分引發了對應 except 1 的異常,執行except中的代碼' # 可選
except <ecxept 2>
    '如果try部分引發了對應 except 2 的異常,執行except中的代碼' # 可選
...
...

except <ecxept n>
    '如果try部分引發了對應 except n 的異常,執行except中的代碼' # 可選
else:
    '如果沒有異常發生,執行else 中的代碼'   #可選
finally:
    '如論異常是否發生,都會執行finally 中的代碼'   #可選
           

try 工作原理:

1、如果當try後的語句執行時發生異常,python就跳回到try并執行第一個比對該異常的except子句,

異常處理完畢,控制流就通過整個try語句(除非在處理異常時又引發新的異常)

2、如果在try後的語句裡發生了異常,卻沒有比對的except子句,異常将被遞交到上層的try,或者到程式的最上層(這樣将結束程式,并列印預設的出錯資訊-執行finally代碼塊中的代碼)。

3、如果在try子句執行時沒有發生異常,python将執行else語句後的語句(如果有else的話),然後控制流通過整個try語句

示例1

print(1/0)
print('this is a except test')

執行結果:

Traceback (most recent call last):
  File "D:/Python/Except/Except1.py", line 21, in <module>
integer division or modulo by zero
    print(1/0)
try/except end
ZeroDivisionError: integer division or modulo by zero
           

零不以做除數,當執行 1除以0時python腳本發生異常,抛出ZeroDivisionError類形的異常,并終止程式運作

使用try/except 捕獲并處理異常

try:
    1 / 0
except IOError:
    '''如果發生IOError 異常,将列印以下資訊'''
    print('This is a IOError except')
except Exception as e:
    '''異常的父類,可以捕獲所有的異常'''
    print("0不能被除")
    print(e)
else:
    print('this is OK')
finally:
    print('try/except end')
           

執行結果:

C:\Python27\python.exe D:/Python/Except/Except1.py
0不能被除
integer division or modulo by zero
try/except end

Process finished with exit code 0

           

過程分析:

當try中1/0發生異常被try捕獲後,會與except定義的異常進行比對,第一個except 比對的是IOError,與捕獲的類形不比對,第二個except 比對Exception,Exception是所有異常的父類,可以比對所有類形的異常包括ZeroDivisionError故執行 第二個except 中的代碼

因為已發生異常,所在esle中的代碼将不會執行

當except 比對并處理異常後,執行finally中的代碼,且無論try中是否捕獲到異常發生,finally中的代碼将都會執行

示例2--未發導常

try:
    1 / 1
except IOError:
    '''如果發生IOError 異常,将列印以下資訊'''
    print('This is a IOError except')
except Exception as e:
    '''異常的父類,可以捕獲所有的異常'''
    print("0不能被除")
    print(e)
else:
    print('this is OK')
finally:
    print('try/except end')
           

執行結果:

C:\Python27\python.exe D:/Python/Except/Except1.py
this is OK
try/except end

Process finished with exit code 0

           

try中沒有捕獲到異常,跳過except ,執行else ,最後執行 finally

異常的參數

一個異常可以帶上參數,可作為輸出的異常資訊參數。

你可以通過except語句來捕獲異常的參數

格式:

try:
    正常的操作
   ......................
except ExceptionType, Argument:
    你可以在這輸出 Argument 的值...
           

示例

try:
    1 / 1
except Exception as e:
    print("0不能被除")
    print(e)
           

執行:integer division or modulo by zero

列印出異常的資訊

觸發異常

可以使用raise語句自己觸發異常

raise [Exception [, args [, traceback]]]
           

語句中Exception是異常的類型(例如,NameError)參數是一個異常參數值。該參數是可選的,如果不提供,異常的參數是"None"。

最後一個參數是可選的(在實踐中很少使用),如果存在,是跟蹤異常對象。

def mye( level ):
    if level < 1:
        raise Exception("Invalid level!", level)
        # 觸發異常後,後面的代碼就不會再執行

try:
    mye(0)                // 觸發異常
except "Invalid level!":
    print 1
else:
    print 2
           

執行:

C:\Python27\python.exe D:/Python/Except/Except1.py
Traceback (most recent call last):
  File "D:/Python/Except/Except1.py", line 43, in <module>
    mye(0)
  File "D:/Python/Except/Except1.py", line 39, in mye
    raise Exception("Invalid level!", level)
Exception: ('Invalid level!', 0)

Process finished with exit code 1
           

注意:為了能夠捕獲異常,"except"語句必須有用相同的異常來抛出類對象或者字元串。

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 使用者代碼生成的警告