目錄
- Python例外處理
- 什么是例外?
- 例外的三部分
- 例外處理
- 模擬背景關系管理
- 斷言
- 拋出例外
- 自定義例外
- 總結
Python例外處理
在Python中存在著兩種錯誤:語法錯誤、邏輯錯誤
語法錯誤在寫程式的必不能犯的,因為只要寫出了語法錯誤,整個程式就無法運行,這Python的規定
而邏輯錯誤,則是我們平常撰寫代碼的程序中產生的,我們需要盡可能避免,
其中有些邏輯錯誤我們可以避免,如下:
inp = input('輸入成績:')
if inp.isdigit():
inp = int(inp)
else:
print('請輸入數字!')
# 如果在inp輸入完后就給它轉換成int型別,如果輸入的是字串的話,那么必定會報錯,
# 所以我們在其輸入后,通過if判斷是否為數字,再進行型別轉換,就可以避免這個錯誤的產生
而有時邏輯錯誤的產生我們無法避免,也可以說無法預知它什么時候產生,舉一個例子,如下:
# 舉例!!!比如我們現在file_path里有很多檔案路徑,其中有些是json格式的檔案,有些不是
import json
for i in file_path:
f = open(i,'r')
res = json.load(f)
# 我們將獲取到的檔案通過反序列化拿到json格式轉Python格式的內容
# 那么此時就會有一個問題,有些檔案它不是json格式啊,我們轉換就會報錯
以上例子就是說明了,我們知道運行程序中會產生錯誤,而我們卻無法避免,因為只要經過轉換不匹配就會報錯,所以我們需要了解產生錯誤,如何來處理!
什么是例外?
例外即是一個事件,該事件會在程式執行程序中發生,影響了程式的正常執行,
一般情況下,在Python無法正常處理程式時就會發生一個例外,
例外是Python物件,表示一個錯誤,
當Python腳本發生例外時我們需要捕獲處理它,否則程式會終止執行,
例外的三部分
- 例外出現的位置
- 例外的型別
- 例外的錯誤資訊

Python針對例外具有很好的提示,我們可以根據例外的型別以及資訊,來對以及進行處理,
下面來了解一下Python中常見的例外:
| 例外型別 | 描述 |
|---|---|
| SyntaxError | Python語法錯誤 |
| NameError | 未宣告/初始化物件 (沒有屬性) |
| AttributeError | 物件沒有這個屬性 |
| TypeError | 對型別無效的操作 |
| ValueError | 傳入無效的引數 |
| IndexEroor | 索引錯誤(超出索引范圍產生) |
| KeyError | 沒有這個鍵產生的錯誤 |
| IndentationError | 縮進錯誤 |
| TabError | Tab 和空格混用 |
| IOError | 輸入/輸出操作失敗 |
| AssertionError | 斷言不成立 |
| BaseException | 所有例外的基類 |
| Exception | 常規錯誤的基類 |
例外處理
Python中捕獲例外需要用到兩個關鍵字:try、except
其中try內正常寫入代碼,如果其中代碼產生錯誤后,錯誤將會被except所捕捉到,從而進行處理,
語法:
try:
... # code
except:
... # 如果try里面的代碼產生錯誤,則執行except里面的代碼
else:
... # try運行完畢后,如果未產生錯誤,則運行這里面的代碼
finally:
... # 不管是否產生錯誤都會執行這里面的代碼
其中try與except 或 try與finally可以配對使用,而else根據需求使用
except可以針對例外型別捕捉,而如果未指定捕獲的例外型別,則默認產生所有例外都會捕獲到
我們先嘗試捕獲指定例外型別
實體:
try:
res = open('1.txt')
except FileNotFoundError as f:
print('該檔案不存在!',f)
執行結果
該檔案不存在! [Errno 2] No such file or directory: '1.txt'
以上是在我們已知代碼會產生這種例外型別的情況下才會捕獲到,也可以針對多個例外型別進行捕獲,語法格式:
try:
pass
except type1 as t:
pass
except type2 as t2:
pass
except (type3,type4) as t3: # 同時檢測兩個例外型別,如果出現其中一個,則執行
pass
# 而它們的執行順序和if類似,如果產生錯誤,從上至下檢測,匹配上了則執行對應里面的except代碼
實體產生幾個例外:
try:
print('1' + 1) # 產生型別錯誤,字串不能和整型相加
except (TypeError,ValueError) as e:
print(e)
# 執行結果:can only concatenate str (not "int") to str
try:
int('s') # 傳值的引數不能被int所轉換
except (TypeError,ValueError) as e:
print(e)
# 執行結果:invalid literal for int() with base 10: 's'
模擬背景關系管理
打開檔案,并在使用完畢后回收資源
try:
res = open('a.txt', mode='at', encoding='utf-8')
try:
print('正在向檔案寫入內容:123')
res.write('123\n')
finally: # 執行完try以后,不管是否產生錯誤,都會關閉檔案
res.close()
print('已關閉檔案')
except IOError: # 檔案是否在打開或讀取程序中產生錯誤
print('Error:沒有找到檔案或者讀取檔案失敗')
執行結果
'正在向檔案寫入內容:123'
'已關閉檔案'
斷言
在某一行加上assert 關鍵字進行斷言,用于判斷斷言陳述句是否成立,如果不成立,其下所有的代碼都不會運行,
print('code....')
assert 1 > 2 # 斷言不成立
# 以下代碼都不會允許
print('Nnnnnn') # 該代碼
執行結果
123
AssertionError # 斷言不成立錯誤
斷言可以用于進行代碼除錯,也可以在函式或其它區域內使用
拋出例外
這里拋出例外指的是我們手動拋出例外,可以是任意型別的例外,使用的關鍵字:raise 例外型別('例外資訊'),以這種格式
x = 5
if x < 10:
raise Exception(f"x小于10,x值為:{x}")
執行結果
Exception: x小于10,x值為:5
raise拋出的例外型別必須繼承Exception這個類
手動拋出例外也會終止程式,當然:我們也可以通過try進行捕獲
自定義例外
既是定義例外,那么我們就需要創建一個類,且繼承BaseException,目前經過筆者測驗:繼承了Exception效果也是一至,那么我們下面定義的類就繼承至Exception
class NotNumberError(Exception):
def __init__(self,data):
self.data = data
def __str__(self):
return self.data
x = 'sd'
if not x.isdigit():
raise NotNumberError('不是數字型別')
執行結果
__main__.NotNumberError: 不是數字型別
總結
使用例外處理就是為了避免我們程式出現錯誤時,可以做出相對應的處理,最主要的就是為了處理那些不可控制的邏輯錯誤,當然并不是try與except寫的越多越好,相反:如果特別多的話,說明該程式存在很多不可控的邏輯錯誤,從而降低程式代碼的可讀性,可控制的邏輯錯誤,可以不必使用,各位讀者大大,See you next time~
技術小白記錄學習程序,有錯誤或不解的地方請指出,如果這篇文章對你有所幫助請
點贊 收藏+關注子夜期待您的關注,謝謝支持!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/249904.html
標籤:python
