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

2021-03-01 Python開發

作者丨王翔丨來研丨清風Pythonpython異常處理
異常與錯誤

錯誤

可以通過IDE或者解釋器給出提示的錯誤
opentxt('a.jpg','r')

語法層面沒有問題,但是自己代碼的邏輯有問題
if age>18: print('未成年')

異常

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

異常分類

1/0

if age>5,age未定義

1+'abc'

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

a={'a':1,'b':2} a['c']

int('abcd')

name='Dracular' print(name.age)

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

異常處理格式

# 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)
得到如下結果:

<class 'ZeroDivisionError'> division by zero <traceback object at 0x00000000032BADC8>
大家會問到追蹤信息是什麼呢?其實大家天天見....當你代碼錯誤了,提示哪一行有問題的時候,這個幫你定位的東西,就是追蹤信息。
想看到追蹤信息需要引入一個模塊,traceback
繼續在__exit__中添加這兩行信息

import traceback
print(traceback.extract_tb(exc_tb))

output:

[('E:/Python/xxxx/b.py', 21, '<module>', 'raise ValueError')]
上面個list什麼意思呢?錯誤的文件,錯誤的行號,文件類型,錯誤的語句

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

相關焦點

  • 有趣的Python上下文管理器
    上下文管理器擁有類似堆棧的邏輯,應按相反的順序退出。任何一個上下文管理器都可以處理異常,若此異常已經被某個管理器所處理,那麼其它的管理器將不會收到有關此異常的任何信息;因此,如果發生異常,諸多嵌套的上下文管理器的邏輯順序就成了運維的重要依據;而問題的另一方面,我們可以使用__exit__方法來引發異常,然後使用上下文管理器對其進行處理。
  • 一文弄懂Python上下文管理器和with用法
    本文帶你快速入門上下文管理器和with用法。上下文管理器,英文context managers,在python官方文檔中這樣描述:上下文管理器是一個對象,它定義了在執行 with 語句時要建立的運行時上下文。 上下文管理器處理進入和退出所需運行時上下文以執行代碼塊。 通常使用 with 語句(在 with 語句中描述),但是也可以通過直接調用它們的方法來使用。
  • Python--- 上下文管理器
    我們的第二段程序就使用了上下文管理器 (with...as...)。上下文管理器有隸屬於它的程序塊。當隸屬的程序塊執行結束的時候(也就是不再縮進),上下文管理器自動關閉了文件 (我們通過f.closed來查詢文件是否關閉)。我們相當於使用縮進規定了文件對象f的使用範圍。
  • Python的with語句與上下文管理器詳解
    二、上下文管理器原理f 對象之所以會自動執行自己的close方法,是因為它是一個上下文管理器,所以我們要先說說什麼是上下文管理器。如果為False,異常會被拋出,用戶需要進行異常處理。如果為True,則表示忽略該異常。
  • 深入了解​Python上下文管理器模塊--contextlib
    今天就讓我們一起學習 Python 中的上下文管理 contextlib。上下文管理器 上下文,簡而言之,就是程式所執行的環境狀態,或者說程式運行的情景。既然提及上下文,就不可避免的涉及 Python 中關於上下文的魔法。上下文管理器(context manager)是 Python2.5 開始支持的一種語法,用於規定某個對象的使用範圍。
  • 叮咚,我精心幫你總結了Python with上下文管理器的知識點,請查收!
    正好前幾天有小夥伴在「測試開發群」裡問「Python上下文管理器」有哪些使用場景。我感覺多數人應該經常用,但是換了個問法後就有點陌生了,所以我花點時間給大家整理下Python上下文管理器的知識點。網上查了下,它們和Python With上下文管理器有關係。所謂的上下文管理器是用來執行with語句時建立的運行時上下文的一個對象,通過調用對象的__ enter _「和_」 exit __ 方法來實現。
  • 十、python基礎之異常處理結構與程序調試方法
    實驗目的:學習python的異常處理和程序調試實驗環境:已正確安裝python3.51、異常的基本概念異常是指程序運行時引發的錯誤,得不到正確的處理將會導致程序終止運行合理地使用異常處理結構可以使得程序更加健壯,具有更強的容錯性。例如:最常見的除數為0,python會拋出「ZeroDivisionError"異常。
  • 深入剖析with的內部原理-異常處理的神器
    with語句能自動關閉啊,好我們來剖析一下:3.深入剖析with內部原理,4步搞定step1:1).with 語句看起來簡單,其實是因為有一個上下文管理器的大神在背後默默的奉獻,計算context的值,返回一個對象
  • 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是有區別的。
  • python面向對象之異常處理
    異常的概念 程序在運行時,如果 `Python 解釋器` 遇到 到一個錯誤,會停止程序的執行,並且提示一些錯誤信息,這就是 異常 程序停止執行並且提示錯誤信息 這個動作,我們通常稱之為:拋出(raise)異常> 程序開發時,很難將 所有的特殊情況 都處理的面面俱到,通過 異常捕獲 可以針對突發事件做集中的處理,從而保證程序的 穩定性和健壯性
  • [Python]文件與異常的錯誤處理
    [Python]文件與異常的錯誤處理1.文件的處理過程# 文件基本操作:打開文件,處理文件,關閉文件the_file = open("sketch.txt", 'r')line_content = the_file.readline()  # 不指定readline的參數,讀取一整行print(line_content)
  • Python小知識:淺談Python的with語句
    exit(type, value, traceback) 返回 False,則會重新拋出異常,讓with 之外的語句邏輯來處理異常,這也是通用做法;如果返回 True,則忽略異常,不再對異常進行處理自定義上下文管理器開發人員可以自定義支持上下文管理協議的類。
  • python 異常處理
    對於python來說,就是工廠類被具體工廠繼承。這樣在簡單工廠模式裡集中在工廠方法上的壓力可以由工廠方法模式裡不同的工廠子類來分擔。抽象的工廠類提供了一個創建對象的方法,也叫作工廠方法。1) 抽象工廠角色(Factory): 這是工廠方法模式的核心,它與應用程式無關。是具體工廠角色必須實現的接口或者必須繼承的父類。
  • Python 的 with 語句
    上下文管理器(Context Manager):支持上下文管理協議的對象,定義執行with語句時要建立的運行時上下文,負責執行with語句塊上下文中的進入與退出操作。運行時上下文(Runtime Context):由上下文管理器創建,通過上下文管理器的__enter__()和__exit__()方法實現。
  • 淺談Python中的with語句
    本文對 with 語句的語法和工作機理進行了介紹,並通過示例介紹了如何實現自定義的上下文管理器,最後介紹了如何使用 contextlib 模塊來簡化上下文管理器的編寫。with 語句是從 Python 2.5 開始引入的一種與異常處理相關的功能,從 2.6 版本開始預設可用。
  • Python 中的 With 語句
    with 語句使用 「with」 語句,使代碼簡潔,處理異常也更優雅。「with語句通過封裝常用的準備工作和清除任務來簡化異常處理。」此外,它將自動關閉文件。with 語句提供了一種確保始終使用清理的方法。
  • 一篇文章幫你搞定Python異常處理
    =1+'str'什麼是異常異常就是程序運行時發生錯誤的信號,在python中,錯誤觸發的異常如下Python中異常種類在python中不同的異常可以用不同的類型(python中統一了類與類型,類型即類)去標識,不同的類對象標識不同的異常,一個異常標識一種錯# 觸發IndexErrorl=['run1','aa']