python異常處理與上下文管理器

2021-09-27 11:11:58 字數 4331 閱讀 6103

python異常處理

異常與錯誤

可以通過ide或者直譯器給出提示的錯誤

語法層面沒有問題,但是自己**的邏輯有問題

if age>18: print('未成年')

異常

多指在程式執行過程中,出現的未知錯誤,語法和邏輯本身是正確的。可以通過**進行處理或修復

異常分類

1/0

if age>5,age未定義

1+'abc'

a=[1,2,3] a[4]

a= a['c']

int('abcd')

name='dracular' print(name.age)

a=iter([1,2]) print(next(a)) print(next(a)) print(next(a))

由sys.exit(0函式引發,當他不處理時,python直譯器退出)

當使用者中斷操作引發(ctrl +c)

當呼叫一種generator的close()方法引發

所有內建的、非系統退出異常是從該類派生的,因為該類派生所有使用者定義的異常

異常處理格式

# python 的完整異常處理格式,原諒我蹩腳的英語注釋,哈哈...

# python 2 中except exception_type, error

# python 3 中except exception_type as error

try:

do something

except exception_type1:

when get exception_type1 error

except exception_type2:

when get exception_type2 error

except exception_typen:

when get exception_type2 error

else:

if not get error,into here

finally:

always execute it ...

多種異常捕獲

剛才介紹了很多異常的分類,也看到了異常處理的格式,那麼針對多種異常如何更簡潔的捕獲呢?

使用with處理異常

用於執行一段**前,進行預處理,執行完成這段**後,進行清理操作

with content_expression[as target(s)]: withbody

大家用到最多的莫過於在讀寫檔案時,使用with open

with open('a.txt','a') as file :

file.write('first line...')

為什麼說他是乙個上下文處理器呢?

首先咱們在檔案讀寫的時候主要分三個步驟:

開啟檔案

操作檔案的內容

關閉檔案

正常情況下,我們使用的方式為:

f=open('a.txt', 'a')

f.write('first line...')

f.close()

那麼如果我們在操作檔案的時候,出現了異常導致系統退出,就無法正常的關閉檔案

但使用with的上下文管理器,就可以達到異常退出時的清理操作!

可是沒有論證,空口在這裡吹逼不太好啊,舉個例子來驗證with自帶的異常清理。

先看下這段**:

import os

try:

f=open('a.txt', 'a+')

f.write('first line...')

raise valueerror

except:

os.rename('a.txt','b.txt')

f.close()

output:

permissionerror: [winerror 32] 另乙個程式正在使用此檔案,程序無法訪問。: 'a.txt' -> 'b.txt'

我們在寫檔案的時候,手動出發乙個異常,然後在except捕獲異常後,去重新命名該檔案。

然後由於沒有正常的關閉,此時你去重新命名會給出檔案正在占用的提示

那同樣的方式,我們使用with操作看看效果:

import os

try:

with open('a.txt', 'a+') as file:

file.write('first line...')

raise valueerror

except:

os.rename('a.txt','b.txt')

此時正常執行完成,程式沒有丟擲異常,為什麼?因為在上下文處理器中,with捕獲異常後,自動的執行了檔案的關閉操作,溜不溜?

上下文管理器原理

所謂上下文管理器的原理,其實就是以下三點

呼叫enter方法,進行預處理操作

執行使用者操作

呼叫exit方法,完成清理操作

知道了原理,讓我們通過自己編寫的上下文管理器,重構一下open的方法,讓它裝逼即耀眼又安全吧

import os

# 自定義乙個上下文管理器

class zhuang13_open:

def __init__(self, file, mode):

self.file = file

self.mode = mode

def __enter__(self):

print('啟動裝13模式,開啟檔案-->%s' % self.file)

self.file = open(self.file, mode=self.mode)

return self.file

def __exit__(self, exc_type, exc_val, exc_tb):

print('亂花從中過,片葉不沾身\n裝完13,記得擦屁股啊')

self.file.close()

# 依舊測試下在異常的情況下是否可以正常關閉檔案

try:

with zhuang13_open('a.txt', 'a+') as file:

file.write('first line...')

raise valueerror

except:

os.rename('a.txt', 'b.txt')

完美結束....

了解下剛才的__exit__

剛才看到在定義__exit__方法時,自帶了三個引數exc_type, exc_val, exc_tb

這是什麼呢?分別為:異常類別,異常值,追蹤資訊,怎麼看他的值呢?

把上面**中raise valueerror改為1/0

__exit__方法中加入print(exc_type, exc_val, exc_tb)

得到如下結果:

division by zero

大家會問到追蹤資訊是什麼呢?其實大家天天見....當你**錯誤了,提示哪一行有問題的時候,這個幫你定位的東西,就是追蹤資訊。

想看到追蹤資訊需要引入乙個模組,traceback

繼續在__exit__中新增這兩行資訊

import traceback

print(traceback.extract_tb(exc_tb))

output:

[('e:/python/***x/b.py', 21, '', 'raise valueerror')]

上面個list什麼意思呢? 錯誤的檔案,錯誤的行號,檔案型別,錯誤的語句

是不是吊炸天?好了今天就學到這裡,碎覺.....

python異常處理與上下文管理器

python異常處理 異常與錯誤可以通過ide或者直譯器給出提示的錯誤 語法層面沒有問題,但是自己 的邏輯有問題 if age 18 print 未成年 異常 多指在程式執行過程中,出現的未知錯誤,語法和邏輯本身是正確的。可以通過 進行處理或修復 異常分類 1 0 if age 5,age未定義 1...

全域性上下文與上下文

全域性上下文由main函式載入系統的主架構和主事件迴圈和全域性資料構成。是上帝創造世界時,建立的基礎事物。萬物之始,大道至簡,衍化至繁。全域性上下文代表著程式執行所需要的基礎資源。是程式執行的基礎。全域性上下文的特徵是在程式執行期間常駐記憶體。全域性上下文的生命週期和應用程式的生命週期相同。與應用程...

程序上下文與中斷上下文

處理器總處於以下狀態中的一種 核心態,執行於程序上下文,核心代表程序執行於核心空間。核心態,執行於中斷上下文,核心代表硬體執行於核心空間。使用者態,執行於使用者空間。程序上下文 在linux中,使用者程式裝入系統形成乙個程序的實質是系統為使用者程式提供乙個完整的執行環境。程序的執行環境是由它的程式 ...