深入 Python 異常處理

2021-02-13 Python開發者

【導語】:本文結合例程總結Python異常處理的相關知識,幫你深入理解python異常處理。

在Python 中的錯誤和異常是什麼?

通常來說,程序中的錯誤至少包括兩種,一種是語法錯誤,另一種則是異常。

語法錯誤

所謂語法錯誤,你應該很清楚,也就是你寫的代碼不符合編程規範,無法被識別與執行,比如下面這個例子的語法錯誤

下面的代碼無法被識別和執行

if name is not None
    print(name)

上面的代碼If 語句漏掉了冒號,不符合 Python 的語法規範,所以程序就會報錯invalid syntax。

語法錯誤

異常則是指程序的語法正確,也可以被執行,但在執行過程中遇到了錯誤,拋出了異常。

比如,最常見的除數不能為0。變量沒有定義。數據類型的運算。

10 / 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero

order * 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'order' is not defined

1 + [1, 2]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'list'

上面報的是常見的報錯,比如ZeroDIvision NameError 和 typeError

還有很多其他異常的類型如 keyError 字典的鍵找不到和FileNotFoundError 文件不存在

try except

使用Python的異常處理語句,可以非常優雅地處理發生的異常。

下面是Python的異常處理語句的模板語法

try:
    # 可能觸發異常的語句塊
except:  
    # 這裡執行異常處理的相關代碼,列印輸出等
else:
    # 如果沒有異常則執行else中的代碼
finally:
    # 不管代碼是否異常,都會執行,一般是資源的關閉和釋放

首先,檢測try語句塊中的錯誤,except語句捕獲異常信息並處理。如果在try子句執行時沒有發生異常,Python將執行else語句後的語句,然後控制流通過整個try語句。

比如看下面的例子。

try:
    print(a*2)
except TypeError:
    print("TypeError")
except:
    print("Not Type Error & Error noted")
    
Not Type Error & Error noted

由於a沒有定義,報的是NameError而不是TypeError。異常最終被except:部分的程序捕捉。

這裡,Runsen補充一下非常重要的知識點:

拋出異常

拋出異常模板:raise 異常類名(附加異常信息) 。下面是示例代碼:

s = "RunsenRunsen"
try:
    if len(s) > 10:
        raise Exception("超過10個字符")
except Exception as err:
    print(err)
    
超過10個字符

有時產生的異常,不想在當前處理,那麼就可以使用raise拋出異常。下面是示例代碼:

def division():
    a = float(input('輸入被除數:'))
    b = float(input("輸入除數:"))
    if a < 0 or b < 0:
        raise Exception("我是Runsen,要求:輸入的數不能小於0。") #出現負數拋出異常。
    c = a / b
    print(a,'÷',b,'=',c)
    
try:
    division()
except Exception as d:
    print('出錯了,',d)
    
運行結果:
輸入被除數:5
輸入除數:-1
出錯了, 我是小學生,輸入的數不能小於0。
輸入被除數:5
輸入除數:0
出錯了, float division by zero

萬能異常

因為異常分了不同的種類,如果不知道,那麼使用exception異常處理就足夠了,它可以接收任何異常

value = 'hello'
try:
    int(value)
#萬能異常處理  
except Exception as e:
    print(e)

自定義異常

實際開發中,有時候系統提供的異常類型不能滿足開發的需求。這時候你可以通過創建一個新的異常類來擁有自己的異常。異常類繼承自 Exception 類,可以直接繼承,或者間接繼承。

# 自定義異常類 MyError ,繼承普通異常基類 Exception
class MyError(Exception):
        def __init__(self, value):
            self.value = value
        def __str__(self):
            return repr(self.value)
try:
    num = input("請輸入數字:")
    if not num.isdigit():  # 判斷輸入的是否是數字
        raise MyError(num)  # 輸入的如果不是數字,手動指定拋出異常
except MyError as e:
    print("MyError:請輸入數字。您輸入的是:", e.value)

請輸入數字:1
請輸入數字:Runsen
MyError:請輸入數字。您輸入的是:Runsen

擴展

大型社交網站的後臺,需要針對用戶發送的請求返回相應記錄。用戶記錄往往儲存在 key-value 結構的資料庫中,每次有請求過來後,我們拿到用戶的 ID,並用 ID 查詢資料庫中此人的記錄,就能返回相應的結果。而資料庫返回的原始數據,往往是 json string 的形式,這就需要我們首先對 json string 進行 decode(解碼),你可能很容易想到下面的方法:

import json
raw_data = queryDB(uid) # 根據用戶的 id,返回相應的信息。queryDB這裡是一個函數
data = json.loads(raw_data)

上面的代碼是不是就足夠呢?

json.loads()函數中,如果輸入的字符串不符合規範,那麼就無法解碼,就會拋出異常。

raw_data一定是json嗎?,因此寫之前就應該考慮如何處理異常

try:
    data = json.loads(raw_data)
except JSONDecodeError as err:
    print('JSONDecodeError: {}'.format(err))

「附件:異常類列表(來源:菜鳥教程)」

異常名稱描述

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尚未實現的方法SyntaxErrorPython 語法錯誤IndentationError縮進錯誤TabErrorTab 和空格混用SystemError一般的解釋器系統錯誤TypeError對類型無效的操作ValueError傳入無效的參數UnicodeErrorUnicode 相關的錯誤UnicodeDecodeErrorUnicode 解碼時的錯誤UnicodeEncodeErrorUnicode 編碼時錯誤UnicodeTranslateErrorUnicode 轉換時錯誤Warning警告的基類DeprecationWarning關於被棄用的特徵的警告FutureWarning關於構造將來語義會有改變的警告OverflowWarning舊的關於自動提升為長整型(long)的警告PendingDeprecationWarning關於特性將會被廢棄的警告RuntimeWarning可疑的運行時行為(runtime behavior)的警告SyntaxWarning可疑的語法的警告UserWarning用戶代碼生成的警告

- EOF -

覺得本文對你有幫助?請分享給更多人

關注「Python開發者」加星標,提升Python技能

點讚和在看就是最大的支持❤️

相關焦點

  • 深入Python異常處理
    keyError 字典的鍵找不到和FileNotFoundError 文件不存在try except使用Python的異常處理語句,可以非常優雅地處理發生的異常。下面是Python的異常處理語句的模板語法try:    # 可能觸發異常的語句塊except:      # 這裡執行異常處理的相關代碼,列印輸出等else:    # 如果沒有異常則執行else中的代碼finally:
  • 十七、深入Python異常處理
    keyError 字典的鍵找不到和FileNotFoundError 文件不存在try except使用Python的異常處理語句,可以非常優雅地處理發生的異常。下面是Python的異常處理語句的模板語法try:    # 可能觸發異常的語句塊except:      # 這裡執行異常處理的相關代碼,列印輸出等else:    # 如果沒有異常則執行else中的代碼finally:
  • python 異常處理
    >在python中,異常是一個類,可以處理和使用異常的分類BaseException 所有異常的基類Exception 常見錯誤的基類ArithmeticError 所有數值計算錯誤的基類Warning 警告的基類AssertError 斷言語句(assert)失敗AttributeError 嘗試訪問未知的對象屬性DeprecattionWarning
  • python異常處理與上下文管理器
    作者丨王翔丨來研丨清風Pythonpython異
  • Python學習筆記:異常處理
    異常概述異常處理機制異常處理機制可以讓程序具有極好的容錯性、讓程序更加健壯。使用try…excepy捕獲異常python的異常處理機制的語法結構:try:    # 業務實現代碼    ...當python解釋器收到異常對象時,會尋找能處理該異常對象的except塊,如果找到合適的except塊,則把該異常對象交給該except塊處理,這個過程被稱為捕獲異常。如果python解釋器找不到捕獲異常的except塊,則運行時環境終止,python解釋器也將退出。
  • [Python]文件與異常的錯誤處理
    [Python]文件與異常的錯誤處理1.文件的處理過程# 文件基本操作:打開文件,處理文件,關閉文件the_file = open("sketch.txt", 'r')line_content = the_file.readline()  # 不指定readline的參數,讀取一整行print(line_content)
  • Python基礎語法-異常處理
    <可能發生異常的語句>except[異常類型]        <處理異常>在python中推薦在except中指定具體的異常類型可能會引發異常的語句>except 異常類型1:      <處理異常>except 異常類型2:      <處理異常>.
  • Python自動化運維開發之異常處理
    在寫代碼的時候,經常會遇到異常。python提供了兩個功能來處理程序在運行中出現的異常和錯誤,可以使用該功能來調試python程序。
  • Python尚學堂高淇|第二季01異常的處理
    那麼,我們如何解決應對異常情況呢? python 的異常機制給我們提供了方 便的處理方式。如上情況,如果是用 python 的異常機制來處理,示意代碼如下 (僅限示意,不能運行):#將 d:/a.txt 拷貝到 e:盤 try: copyFile("d:/a.txt","e:/a.txt") except: print("文件無法拷貝")異常機制本質 異常指程序運行過程中出現的非正常現象,例如用戶輸入錯誤、除數為零
  • Python實用指南:異常處理
    Python 將這些情況視為異常,並根據異常的類型引發不同類型的錯誤。ValueError、 TypeError、 AttributeError 和 SyntaxError 是這些異常的一些示例。好消息是 Python 還提供了處理異常的方法。考慮下面的代碼,它要求用戶輸入一個數字並列印該數字的平方。
  • Python異常捕獲與處理
    什麼是異常?異常即是一個事件,該事件會在程序執行過程中發生,影響了程序的正常執行。一般情況下,在Python無法正常處理程序時就會發生一個異常。異常是Python對象,表示一個錯誤。當Python腳本發生異常時我們需要捕獲處理它,否則程序會終止執行。當一個未捕獲的異常發生時,Python將結束程序並列印一個堆棧跟蹤信息,以及異常名和附加信息。
  • 【Python基礎】10 異常處理
    一 什麼是異常異常是程序發生錯誤的信號。程序一旦出現錯誤,便會產生一個異常,若程序中沒有處理它,就會拋出該異常,程序的運行也隨之終止。在Python中,錯誤觸發的異常如下插圖:異常處理二 異常處理為了保證程序的容錯性與可靠性,即在遇到錯誤時有相應的處理機制不會任由程序崩潰掉,我們需要對異常進行處理,處理的基本形式為
  • 一文讀懂Python中的異常處理
    ,良好的異常處理可以讓你的程序更加健壯,清晰的錯誤信息更能幫助你快速修復問題。在Python中,和不部分高級語言一樣,使用了try/except/finally語句塊來處理異常,如果你有其他程式語言的經驗,實踐起來並不難。
  • 16-python中的異常
    通過前兩天的文章14-python中的函數,15-再敘python中的函數我們對python中有關函數的知識有了系統的認識和學習,今天我們將接著來看一下python中的異常。(一)Bug的由來和分類    "Bug"一詞的原意是"昆蟲"或"蟲子";而在電腦系統或程序中隱藏著的一些未被發現的缺陷或問題,人們也叫它"bug"。
  • 一文看懂Python異常處理(exception, try和raise語句)
    即便Python程序的語法是正確的,還是會有各種各樣意想不到的異常或錯誤。大多數的異常都不會被程序處理,而是以錯誤信息的形式展現出來,如下所示:>>> 10 * (1/0)Traceback (most recent call last): File "<stdin>", line 1, in ?
  • Python 程序異常處理
    異常處理    異常就是運行期檢測到的錯誤。計算機語言針對可能出現的錯誤定義了異常類型,某種錯誤引發對應的異常時,異常處理程序將被啟動,從而恢復程序的正常運行。OSError as error:    print('打開文件出錯\n原因是:' + str(error))# 打開文件出錯# 原因是:[Errno 2] No such file or directory: 'test.txt'例 3.3    一個try語句可能包含多個except子句,分別來處理不同的特定的異常
  • Python中的錯誤和異常
    另一方面,當某些內部事件發生時,會引發異常,從而改變程序的正常流程。python中會發生兩種類型的錯誤。語法錯誤邏輯錯誤(異常)語法錯誤如果未遵循正確的語言語法,則會引發語法錯誤。"g:/黑蘋果備份請勿刪除/代碼/exercise24 (1)/python加密.py" File "g:/黑蘋果備份請勿刪除/代碼/exercise24 (1)/python加密.py", line 6 if(amount>2999) ^SyntaxError: invalid syntax它返回語法錯誤消息,因為在if語句後:
  • 異常處理的其他3個小技巧
  • Python文件和異常處理
    /test.txt", "w") as f:  f.write("xxxx") # 寫入數據, 具體方法可以參考help文檔2、異常處理即便程序的語法是正確的,在運行它的時候,也有可能發生錯誤。運行期檢測到的錯誤被稱為異常。
  • 給妹子講python-S01E23初識異常
    1.異常的默認處理和主動捕獲2.主動觸發異常和自定義異常3.finally終止代碼塊的用法【妹子問】從字面上來看,異常是程序運行時出現的錯誤吧。沒錯,每當在運行時檢測到程序錯誤時,python就會引發異常。對待異常有兩種方法:一是可以在程序中捕捉和響應錯誤;或者忽略已發生的異常。