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


目錄結構:

contents structure [-]

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

1.try,except,else,finally塊

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

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


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

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對象(包含了異常拋出后的方法調用棧信息)

例如:

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 語句無論是否發生異常都將執行最后的代碼。

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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM