深入 Python 異常處理

2021-02-23 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異常處理
    解決方案首先我們要了解異常才能處理異常那我們來就說一說異常的定義:程序運行過程中出現的錯誤或遇到的意外情況其次是錯誤的類型分別有:語法錯誤、運行錯誤、邏輯錯誤而我們通常出錯的理由無非是這些:輸入錯誤、下標越界、類型錯誤、操作不當等等接著我們來看一看報錯的構成吧接下來我們的重點來了,在python異常處理會用到
  • python入門——Python中異常處理
    python大數據課堂已經開始了。想轉行大數據,數據挖掘,機器學習,人工智慧的小夥伴可以關注啦。上一篇帶大家了解了python中的I/O函數。今天我們來繼續了解python中的異常處理。調試環境以python3.6環境為例。需要代碼和demo的朋友可以搜索「欒鵬全棧」到我的CSDN博客。
  • python基礎---異常處理
    程序的異常處理今天霖小白心血來潮想來分享一下python基礎中的如何異常處理,使程序有更好的用戶體驗。前言python程序對用戶的輸入有一定的要求,所以當實際輸入不滿足程序要求時,可能在程序運行過程中會直接報錯無法進行下一步的運行。
  • python入門學習異常處理類型
    前言異常是指在程序執行過程中發生的一個事件,影響了程序的正常執行,例如:0做了分母。異常是Python對象,表示一個錯誤。當Python腳本發生異常時我們需要捕獲處理它,否則程序會終止執行。在Java語言中我們知道異常的常用結構為try catch組成,有時也會用到finally,那麼在python中異常是如何來處理的呢?python中的異常處理1.python異常簡單語法python異常的簡單語法為try-except-else語法,注意這裡的關鍵字是except而不是Exception,這與java是有區別的。
  • 深入剖析with的內部原理-異常處理的神器
    ,調用上下文管理器裡的__exit()__方法,其返回值直接忽略注意重點來了,重點來了,重點來了若在with中的代碼執行過程中,呱唧發生了異常,也會調用上下文管理器的__exit__()方法,並把異常的類型,異常的值和traceback信息全部都以參數的形式傳遞給_
  • python面向對象之異常處理
    異常的概念 程序在運行時,如果 `Python 解釋器` 遇到 到一個錯誤,會停止程序的執行,並且提示一些錯誤信息,這就是 異常 程序停止執行並且提示錯誤信息 這個動作,我們通常稱之為:拋出(raise)異常> 程序開發時,很難將 所有的特殊情況 都處理的面面俱到,通過 異常捕獲 可以針對突發事件做集中的處理,從而保證程序的 穩定性和健壯性
  • [Python]文件與異常的錯誤處理
    [Python]文件與異常的錯誤處理1.文件的處理過程# 文件基本操作:打開文件,處理文件,關閉文件the_file = open("sketch.txt", 'r')line_content = the_file.readline()  # 不指定readline的參數,讀取一整行print(line_content)
  • python 異常處理
    對於python來說,就是工廠類被具體工廠繼承。這樣在簡單工廠模式裡集中在工廠方法上的壓力可以由工廠方法模式裡不同的工廠子類來分擔。抽象的工廠類提供了一個創建對象的方法,也叫作工廠方法。1) 抽象工廠角色(Factory): 這是工廠方法模式的核心,它與應用程式無關。是具體工廠角色必須實現的接口或者必須繼承的父類。
  • 深入Python異常處理
    keyError 字典的鍵找不到和FileNotFoundError 文件不存在try except使用Python的異常處理語句,可以非常優雅地處理發生的異常。下面是Python的異常處理語句的模板語法try:    # 可能觸發異常的語句塊except:      # 這裡執行異常處理的相關代碼,列印輸出等else:    # 如果沒有異常則執行else中的代碼finally:
  • python異常處理與上下文管理器
    作者丨王翔丨來研丨清風Pythonpython異
  • Python學習第50課-處理錯誤和異常
    【每天幾分鐘,從零入門python編程的世界!】在工作當中會經常出現意料不到的錯誤和異常,就需要我們對可能出現的錯誤和異常進行預判,然後加上捕獲和處理錯誤異常的代碼,否則,程序在運行過程中,遇到錯誤和異常就會crash崩潰,無法繼續向下執行。●Python的錯誤種類:①語法錯誤,或稱解析錯誤。
  • 一篇文章幫你搞定Python異常處理
    =1+'str'什麼是異常異常就是程序運行時發生錯誤的信號,在python中,錯誤觸發的異常如下Python中異常種類在python中不同的異常可以用不同的類型(python中統一了類與類型,類型即類)去標識,不同的類對象標識不同的異常,一個異常標識一種錯# 觸發IndexErrorl=['run1','aa']
  • 十七、深入Python異常處理
    keyError 字典的鍵找不到和FileNotFoundError 文件不存在try except使用Python的異常處理語句,可以非常優雅地處理發生的異常。下面是Python的異常處理語句的模板語法try:    # 可能觸發異常的語句塊except:      # 這裡執行異常處理的相關代碼,列印輸出等else:    # 如果沒有異常則執行else中的代碼finally:
  • python教程之九錯誤和異常處理
    大多數的異常都不會被程序處理,都以錯誤信息的形式展現在這裡:>>> 10 * (1/0)Traceback (most recent call last):File "<pyshell#78>", line 1, in <module>10 * (1/0)ZeroDivisionError
  • 十、python基礎之異常處理結構與程序調試方法
    實驗目的:學習python的異常處理和程序調試實驗環境:已正確安裝python3.51、異常的基本概念異常是指程序運行時引發的錯誤,得不到正確的處理將會導致程序終止運行合理地使用異常處理結構可以使得程序更加健壯,具有更強的容錯性。例如:最常見的除數為0,python會拋出「ZeroDivisionError"異常。
  • 16-python中的異常
    通過前兩天的文章14-python中的函數,15-再敘python中的函數我們對python中有關函數的知識有了系統的認識和學習,今天我們將接著來看一下python中的異常。(一)Bug的由來和分類    "Bug"一詞的原意是"昆蟲"或"蟲子";而在電腦系統或程序中隱藏著的一些未被發現的缺陷或問題,人們也叫它"bug"。
  • 【Python基礎】10 異常處理
    一 什麼是異常異常是程序發生錯誤的信號。程序一旦出現錯誤,便會產生一個異常,若程序中沒有處理它,就會拋出該異常,程序的運行也隨之終止。在Python中,錯誤觸發的異常如下插圖:異常處理二 異常處理為了保證程序的容錯性與可靠性,即在遇到錯誤時有相應的處理機制不會任由程序崩潰掉,我們需要對異常進行處理,處理的基本形式為
  • python妙招-異常處理之try-except
    Python中檢測處理異常是非常重要的,這可以增加代碼的健壯性,我們在寫python程序的時候,會可能會遇到一些不可預料的情況,一旦遇到這些情況,運行時程序便可能會崩潰。比如:讀寫文件時候文件打開錯誤或者文件寫入錯誤,寫爬蟲時網絡請求失敗,返回錯誤404.再或者函數處理一些不確定參數時候,都可以用到異常捕獲。
  • python3全棧開發-異常處理
    一、 什麼是異常異常就是程序運行時發生錯誤的信號(在程序出現錯誤時,則會產生一個異常,若程序沒有處理它,則會拋出該異常,程序的運行也隨之終止),在python中,錯誤觸發的異常如下而錯誤分成兩種二 、異常的種類在python中不同的異常可以用不同的類型
  • python中異常報錯的總結分析與處理方式
    想必到現在經過python基礎的學習之後,小夥伴們都已經開始寫很多腳本了,有大的有小的,但是有的時候並不是所寫的能夠順利跑出結果來,期間會有不但的報錯以及異常,很多我們都不理解,所以也就不會修改,這是寫腳本中常遇到的問題,雖然在當時被定型為絆腳石,但是多次遇到異常後我們會發現這是一筆不可多得的財富。對個人的成長有很大的幫助。