Python中的異常處理實例分析

WBOY
發布: 2023-05-16 14:28:06
轉載
1545 人瀏覽過

    一、什麼是異常

    在python中,錯誤觸發的例外如下

    Python中的異常處理實例分析

    #二、異常的種類

    在python中不同的異常可以用不同的類型去標識,一個異常標識一種錯誤。

      1 、常用異常類別
    • AttributeError 試圖存取一個物件沒有的樹形,例如foo.x,但是foo沒有屬性x
    • #IOError 輸入/輸出異常;基本上是無法開啟檔案
    • ImportError 無法引入模組或套件;基本上是路徑問題或名稱錯誤
    • #IndentationError 語法錯誤(的子類別) ;程式碼沒有正確對齊
    • IndexError 下標索引超出序列邊界,例如當x只有三個元素,卻試圖存取x [5]
    • KeyError 試圖存取字典裡不存在的鍵
    • KeyboardInterrupt Ctrl C被按下
    • #NameError 使用一個還未被賦予物件的變數
    • SyntaxError Python程式碼非法,程式碼不能編譯(個人認為這是語法錯誤,寫錯了)
    • TypeError 傳入物件類型與要求的不符合
    • #UnboundLocalError 試圖存取一個還未被設定的局部變量,基本上是由於另有一個同名的全域變量,導致你以為正在存取它
    • ValueError 傳入一個呼叫者不期望的值,即使值的類型是正確的

    ##2、例外範例:

    # TypeError:int类型不可迭代
    for i in 3:
        pass
    
    # ValueError
    num=input(">>: ") #输入hello
    int(num)
    
    # NameError
    aaa
    
    # IndexError
    l=['egon','aa']
    l[3]
    
    # KeyError
    dic={'name':'egon'}
    dic['age']
    
    # AttributeError
    class Foo:pass
    Foo.x
    
    # ZeroDivisionError:无法完成计算
    res1=1/0
    res2=1+'str'
    登入後複製

    三、異常處理

    1、基本語法try...except

    try:
        被检测的代码块
    except 异常类型:
        try中一旦检测到异常,就执行这个位置的逻辑
    登入後複製

    範例

    try:
        f = [ 'a', 'a', 'a','a','a', 'a','a',]
        g = (line.strip() for line in f) #元组推导式
        print(next(g))
        print(next(g))
        print(next(g))
        print(next(g))
        print(next(g))
    except StopIteration:
        f.close()
    登入後複製

    異常類只能用來處理指定的異常情況,如果非指定異常則無法處理。

    s1 = 'hello'
    try:
        int(s1)
    except IndexError as e:  # 未捕获到异常,程序直接报错
        print(e)
    登入後複製

    2、多分支異常except..except與萬能例外:Exception

    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)
    登入後複製

    3、try/except...else

    try/except 語句還有一個可選的else 子句,如果使用這個子句,那麼必須放在所有的except 子句之後。

    else 子句將在 try 子句沒有發生任何異常的時候執行。

    for arg in sys.argv[1:]:
        try:
            f = open(arg, 'r')
        except IOError:
            print('cannot open', arg)
        else:
            print(arg, 'has', len(f.readlines()), 'lines')
            f.close()
    登入後複製

    4、異常的最終執行finally

    try-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'

    #無論異常與否,都會執行該模組,通常是進行清理工作

    四、拋出例外raise

    Python 使用raise 語句拋出一個指定的例外。

    raise語法格式如下:

    raise [Exception [, args [, traceback]]]
    登入後複製
    try:
        raise TypeError('抛出异常,类型错误')
    except Exception as e:
        print(e)
    登入後複製

    raise 唯一的一個參數指定了要被拋出的例外。它必須是一個異常的實例或是異常的類別(也就是 Exception 的子類別)。

    如果你只想知道這是否拋出了一個異常,並不想去處理它,那麼一個簡單的 raise 語句就可以再次把它拋出。

    try:
            raise NameError('HiThere')
        except NameError:
            print('An exception flew by!')
            raise
       
    #An exception flew by!
    #Traceback (most recent call last):
    #  File "", line 2, in ?
    #NameError: HiThere
    登入後複製

    五、自訂異常

    你可以透過建立一個新的異常類別來擁有自己的異常。異常類別繼承自 Exception 類,可以直接繼承,或間接繼承,例如:

    在這個範例中,類別 Exception 預設的 __init__() 被覆寫。

    class EgonException(Exception):
        def __init__(self, msg):
            self.msg = msg
    
        def __str__(self):
            return self.msg
    
    
    try:
        raise EgonException('抛出异常,类型错误')
    except EgonException as e:
        print(e) 
    
    #抛出异常,类型错误
    登入後複製

    基礎異常類

    當創建一個模組有可能拋出多種不同的異常時,一種通常的做法是為這個包建立一個基礎異常類,然後基於這個基礎類別為不同的錯誤情況創建不同的子類別:

    大多數的異常的名字都以"Error"結尾,就跟標準的異常命名一樣。

    class Error(Exception):
        """Base class for exceptions in this module."""
        pass
     
    class InputError(Error):
        """Exception raised for errors in the input.
     
        Attributes:
            expression -- input expression in which the error occurred
            message -- explanation of the error
        """
     
        def __init__(self, expression, message):
            self.expression = expression
            self.message = message
     
    class TransitionError(Error):
        """Raised when an operation attempts a state transition that's not
        allowed.
     
        Attributes:
            previous -- state at beginning of transition
            next -- attempted new state
            message -- explanation of why the specific transition is not allowed
        """
     
        def __init__(self, previous, next, message):
            self.previous = previous
            self.next = next
            self.message = message
    登入後複製

    六、斷言assert

    assert(斷言)用來判斷一個表達式,在表達式條件為 false 的時候觸發異常。

    斷言可以在條件不滿足程式運行的情況下直接傳回錯誤,而不必等待程式執行後出現崩潰的情況。

    語法格式如下:

    assert expression
    登入後複製

    等價於:

    if not expression:
        raise AssertionError
    登入後複製

    assert 後面也可以緊接參數:

    assert expression [, arguments]
    登入後複製

    等價於:

    if not expression:
        raise AssertionError(arguments)
    登入後複製

    以下實例判斷目前系統是否為Linux,如果不滿足條件則直接觸發異常,不必執行接下來的程式碼:###
    import sys
    assert ('linux' in sys.platform), "该代码只能在 Linux 下执行"
    # 接下来要执行的代码
    
    # Traceback (most recent call last):
    #    File "C:/PycharmProjects/untitled/run.py", line 2, in 
    #      assert ('linux' in sys.platform), "该代码只能在 Linux 下执行"
    #  AssertionError: 该代码只能在 Linux 下执行
    登入後複製

    以上是Python中的異常處理實例分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    相關標籤:
    來源:yisu.com
    本網站聲明
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
    熱門教學
    更多>
    最新下載
    更多>
    網站特效
    網站源碼
    網站素材
    前端模板