【導語】:本文結合例程總結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技能
點讚和在看就是最大的支持❤️