【Python】解析Python中的異常操做

目錄結構:html

contents structure [-]

python中的異常分爲運行時異常和語法異常,運行時異常發生在程序運行階段,而語法異常發生在解釋器檢查階段。該文章接下來所提到的異常都是運行時異常。python

1.try,except,else,finally塊

下面是python中與異常相關的關鍵字linux

關鍵字 關鍵字說明
try/except 捕獲異常說明
else 若是try沒有捕獲到異常,則執行else的語句
finally 不管是否出現異常,都執行代碼


下面將逐步講解這些關鍵字的使用。express

1.1 異常處理 

捕捉異常能夠使用try/except語句。

try/except語句用來檢測try語句塊中的錯誤,從而讓except語句捕獲異常信息並處理。

若是你不想在異常發生時結束你的程序,只需在try裏捕獲它。

打開一個文件,在該文件中的內容寫入內容函數

try:
    fh = open("testfile", "w")
    fh.write("這是一個測試文件,用於測試異常!!")
except IOError:
    print "Error: 沒有找到文件或讀取文件失敗"
else:
    print "內容寫入文件成功"
finally:
    fh.close()

1.2 使用except而不帶任何異常類型

你能夠不帶任何異常類型使用except,以下實例:測試

try:
    正常的操做
   ......................
except:
    發生異常,執行這塊代碼
   ......................
else:
    若是沒有異常執行這塊代碼

以上方式try-except語句捕獲全部發生的異常。咱們能夠使用sys.exc_info()本身捕獲異常詳細信息,exc_info()的返回值是一個包含三個元素的Tuple(元組)數據類型。格式爲(type, value, traceback),其中type是被捕獲異常的類型(BaseException的派生類),value是異常實例(異常類型的實例),traceback是一個traceback對象(包含了異常拋出後的方法調用棧信息)

例如:this

import traceback
import sys
try:
     raise ValueError('this is a exp')
except:
    ex_type, ex_val, ex_stack = sys.exc_info()
    print(ex_type)
    print(ex_val)
    for stack in traceback.extract_tb(ex_stack):
        print(stack)

 

1.3 使用except而帶多種異常類型

try:
    正常的操做
   ......................
except(Exception1[, Exception2[,...ExceptionN]]]):
   發生以上多個異常中的一個,執行這塊代碼
   ......................
else:
    若是沒有異常執行這塊代碼

案例:編碼

try:
    f1 = open("testfile.txt", "w+")
    f1.read()
    a = 1 / 0
except (IOError,ZeroDivisionError) as ercode:
    print("發生錯誤了,錯誤代碼爲:" + str(ercode))
else:
    print("內容寫入文件成功")
    f1.close() 

 

1.4 try-finally 語句

try-finally 語句不管是否發生異常都將執行最後的代碼。spa

try:
<語句>
finally:
<語句>    #退出try時總會執行
raise

下面案例從代碼上保證了程序的健壯性:操作系統

try:
    fh = open("testfile", "w")
    try:
        fh.write("這是一個測試文件,用於測試異常!!")
    finally:
        print "關閉文件"
        fh.close()
except IOError:
    print "Error: 沒有找到文件或讀取文件失敗"

2.內置的異常類

下面的表列舉了部分標準的python異常

異常名稱 描述
AssertionError 斷言語句(assert)失敗
AttributeError 嘗試訪問未知的對象屬性
EOFError 用戶輸入文件末尾標誌EOF(Ctrl+d)
FloatingPointError 浮點計算錯誤
GeneratorExit generator.close()方法被調用的時候
ImportError 導入模塊失敗的時候
IndexError 索引超出序列的範圍
KeyError 字典中查找一個不存在的關鍵字
KeyboardInterrupt 用戶輸入中斷鍵(Ctrl+c)
MemoryError 內存溢出(可經過刪除對象釋放內存)
NameError 嘗試訪問一個不存在的變量
NotImplementedError 還沒有實現的方法
OSError 操做系統產生的異常(例如打開一個不存在的文件)
OverflowError 數值運算超出最大限制
ReferenceError 弱引用(weak reference)試圖訪問一個已經被垃圾回收機制回收了的對象
RuntimeError 通常的運行時錯誤
StopIteration 迭代器沒有更多的值
SyntaxError Python的語法錯誤
IndentationError 縮進錯誤
TabError Tab和空格混合使用
SystemError Python編譯器系統錯誤
SystemExit Python編譯器進程被關閉
TypeError 不一樣類型間的無效操做
UnboundLocalError 訪問一個未初始化的本地變量(NameError的子類)
UnicodeError Unicode相關的錯誤(ValueError的子類)
UnicodeEncodeError Unicode編碼時的錯誤(UnicodeError的子類)
UnicodeDecodeError Unicode解碼時的錯誤(UnicodeError的子類)
UnicodeTranslateError Unicode轉換時的錯誤(UnicodeError的子類)
ValueError 傳入無效的參數
ZeroDivisionError 除數爲零

 

python異常類的層次結構

BaseException
+-- SystemExit
+-- KeyboardInterrupt
+-- GeneratorExit
+-- Exception
      +-- StopIteration
      +-- ArithmeticError
      |    +-- FloatingPointError
      |    +-- OverflowError
      |    +-- ZeroDivisionError
      +-- AssertionError
      +-- AttributeError
      +-- BufferError
      +-- EOFError
      +-- ImportError
      +-- LookupError
      |    +-- IndexError
      |    +-- KeyError
      +-- MemoryError
      +-- NameError
      |    +-- UnboundLocalError
      +-- OSError
      |    +-- BlockingIOError
      |    +-- ChildProcessError
      |    +-- ConnectionError
      |    |    +-- BrokenPipeError
      |    |    +-- ConnectionAbortedError
      |    |    +-- ConnectionRefusedError
      |    |    +-- ConnectionResetError
      |    +-- FileExistsError
      |    +-- FileNotFoundError
      |    +-- InterruptedError
      |    +-- IsADirectoryError
      |    +-- NotADirectoryError
      |    +-- PermissionError
      |    +-- ProcessLookupError
      |    +-- TimeoutError
      +-- ReferenceError
      +-- RuntimeError
      |    +-- NotImplementedError
      +-- SyntaxError
      |    +-- IndentationError
      |         +-- TabError
      +-- SystemError
      +-- TypeError
      +-- ValueError
      |    +-- UnicodeError
      |         +-- UnicodeDecodeError
      |         +-- UnicodeEncodeError
      |         +-- UnicodeTranslateError
      +-- Warning
           +-- DeprecationWarning
           +-- PendingDeprecationWarning
           +-- RuntimeWarning
           +-- SyntaxWarning
           +-- UserWarning
           +-- FutureWarning
           +-- ImportWarning
           +-- UnicodeWarning
           +-- BytesWarning
           +-- ResourceWarning

3.自定義異常類

下面的這張圖片是python中的異常繼承樹

python的異常有個大基類BaseException。而後繼承的是Exception。因此咱們自定義類也必須繼承Exception。

#最簡單的自定義異常
class FError(Exception):
    pass

拋出異常、用try-except拋出

try:
    raise FError("自定義異常")
except FError as e:
    print(e)

 


下面的異常類模板比較常見

class CustomError(Exception):
    def __init__(self,ErrorInfo):
        super().__init__(self) #初始化父類
        self.errorinfo=ErrorInfo
    def __str__(self):
        return self.errorinfo

if __name__ == '__main__':
    try:
        raise CustomError('客戶異常')
    except CustomError as e:
        print(e)

 

4.如何拋出異常

當程序出現錯誤,python會自動引起異常,也能夠經過raise顯示地引起異常。一旦執行了raise語句,raise後面的語句將不能執行。
 咱們能夠使用raise語句本身觸發異常

raise語法格式以下:

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

語句中 Exception 是異常的類型(例如,NameError)參數標準異常中任一種,args 是自已提供的異常參數。

最後一個參數是可選的(在實踐中不多使用),若是存在,是跟蹤異常對象。
實例

一個異常能夠是一個字符串,類或對象。 Python的內核提供的異常,大多數都是實例化的類,這是一個類的實例的參數。

定義一個異常很是簡單,以下所示:

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

注意:爲了可以捕獲異常,"except"語句必須有用相同的異常來拋出類對象或者字符串。

例如咱們捕獲以上異常,"except"語句以下所示:

try:
    正常邏輯
except Exception,err:
    觸發自定義異常    
else:
    其他代碼

實例:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 定義函數
def mye( level ):
    if level < 1:
        raise Exception,"Invalid level!"
        # 觸發異常後,後面的代碼就不會再執行
try:
    mye(0)            # 觸發異常
except Exception,err:
    print 1,err
else:
    print 2

執行以上代碼,輸出結果爲:

$ python test.py
1 Invalid level!

 


python3.6之後 改成

def mye( level ):
    if level < 1:
        raise Exception("Invalid level!")
        # 觸發異常後,後面的代碼就不會再執行
try:
    mye(0)            # 觸發異常
except Exception as err:
    print(1,err)
else:
    print(2)

5.設置斷言語句

python支持assert語句,assert的用法以下:

assert condition

若是condition爲false,那麼raise一個AssertionError出來。邏輯上等同於:

if not condition:
    raise AssertionError()


也能夠爲assert添加異常參數

assert expression [, arguments]
assert 表達式 [, 參數]


案例:

import sys
assert ('linux' in sys.platform), "This code runs on Linux only."

 

參考文章:
https://www.runoob.com/python/python-exceptions.html
https://blog.csdn.net/qq_39247153/article/details/81082313

https://www.geeksforgeeks.org/python-set-5-exception-handling/

相關文章
相關標籤/搜索