
python異常處理_python異常類型_python異常
#!/usr/bin/python
import traceback
try:
1/0
#except Exception,e:
# print traceback.format_exc()
except Exception as e:
print e
#!/usr/bin/python
import traceback
try:
1/0
#except Exception,e:
# print traceback.format_exc()
except Exception , e:
print e
Python的異常處理能力是很強(qiáng)大的,可向用戶準(zhǔn)確反饋出錯(cuò)信息。在Python中,異常也是對(duì)象,可對(duì)它進(jìn)行操作。所有異常都是基類Exception的成員。所有異常都從基類Exception繼承,而且都在exceptions模塊中定義。Python自動(dòng)將所有異常名稱放在內(nèi)建命名空間中,所以程序不必導(dǎo)入exceptions模塊即可使用異常。一旦引發(fā)而且沒(méi)有捕捉SystemExit異常,程序執(zhí)行就會(huì)終止。如果交互式會(huì)話遇到一個(gè)未被捕捉的SystemExit異常,會(huì)話就會(huì)終止。
方式一:try語(yǔ)句:
1使用try和except語(yǔ)句來(lái)捕獲異常
try:
block
except [exception,[data…]]:
block
try:
block
except [exception,[data…]]:
block
else:
block
該種異常處理語(yǔ)法的規(guī)則是:
· 執(zhí)行try下的語(yǔ)句,如果引發(fā)異常,則執(zhí)行過(guò)程會(huì)跳到第一個(gè)except語(yǔ)句。
· 如果第一個(gè)except中定義的異常與引發(fā)的異常匹配,則執(zhí)行該except中的語(yǔ)句。
· 如果引發(fā)的異常不匹配第一個(gè)except,則會(huì)搜索第二個(gè)except,允許編寫的except數(shù)量沒(méi)有限制。
· 如果所有的except都不匹配,則異常會(huì)傳遞到下一個(gè)調(diào)用本代碼的最高層try代碼中。
· 如果沒(méi)有發(fā)生異常,則執(zhí)行else塊代碼。
例:
try:
f = open(“file.txt”,”r”)
except IOError, e:
print e
捕獲到的IOError錯(cuò)誤的詳細(xì)原因會(huì)被放置在對(duì)象e中,然后運(yùn)行該異常的except代碼塊
捕獲所有的異常
try:
a=b
b=c
except Exception,ex:
print Exception,”:”,ex
使用except子句需要注意的事情,就是多個(gè)except子句截獲異常時(shí),如果各個(gè)異常類之間具有繼承關(guān)系,則子類應(yīng)該寫在前面,否則父類將會(huì)直接截獲子類異常。放在后面的子類異常也就不會(huì)執(zhí)行到了。
2 使用try跟finally:
語(yǔ)法如下:
try:
block
finally:
block
該語(yǔ)句的執(zhí)行規(guī)則是:
· 執(zhí)行try下的代碼。
· 如果發(fā)生異常,在該異常傳遞到下一級(jí)try時(shí),執(zhí)行finally中的代碼。
· 如果沒(méi)有發(fā)生異常,則執(zhí)行finally中的代碼。
第二種try語(yǔ)法在無(wú)論有沒(méi)有發(fā)生異常都要執(zhí)行代碼的情況下是很有用的。例如我們?cè)?a href='/map/python/' style='color:#000;font-size:inherit;'>python中打開(kāi)一個(gè)文件進(jìn)行讀寫操作,我在操作過(guò)程中不管是否出現(xiàn)異常,最終都是要把該文件關(guān)閉的。
這兩種形式相互沖突,使用了一種就不允許使用另一種,而功能又各異
2. 用raise語(yǔ)句手工引發(fā)一個(gè)異常:
raise [exception[,data]]
在Python中,要想引發(fā)異常,最簡(jiǎn)單的形式就是輸入關(guān)鍵字raise,后跟要引發(fā)的異常的名稱。異常名稱標(biāo)識(shí)出具體的類:Python異常是那些類的對(duì)象。執(zhí)行raise語(yǔ)句時(shí),Python會(huì)創(chuàng)建指定的異常類的一個(gè)對(duì)象。raise語(yǔ)句還可指定對(duì)異常對(duì)象進(jìn)行初始化的參數(shù)。為此,請(qǐng)?jiān)诋惓n惖拿Q后添加一個(gè)逗號(hào)以及指定的參數(shù)(或者由參數(shù)構(gòu)成的一個(gè)元組)。
例:
try:
raise MyError #自己拋出一個(gè)異常
except MyError:
print ‘a(chǎn) error’
raise ValueError,’invalid argument’
捕捉到的內(nèi)容為:
type = VauleError
message = invalid argument
3. 采用traceback(跟蹤)模塊查看異常
發(fā)生異常時(shí),Python能“記住”引發(fā)的異常以及程序的當(dāng)前狀態(tài)。Python還維護(hù)著traceback(跟蹤)對(duì)象,其中含有異常發(fā)生時(shí)與函數(shù)調(diào)用堆棧有關(guān)的信息。記住,異??赡茉谝幌盗星短纵^深的函數(shù)調(diào)用中引發(fā)。程序調(diào)用每個(gè)函數(shù)時(shí),Python會(huì)在“函數(shù)調(diào)用堆?!钡钠鹗继幉迦牒瘮?shù)名。一旦異常被引發(fā),Python會(huì)搜索一個(gè)相應(yīng)的異常處理程序。如果當(dāng)前函數(shù)中沒(méi)有異常處理程序,當(dāng)前函數(shù)會(huì)終止執(zhí)行,Python會(huì)搜索當(dāng)前函數(shù)的調(diào)用函數(shù),并以此類推,直到發(fā)現(xiàn)匹配的異常處理程序,或者Python抵達(dá)主程序?yàn)橹?。這一查找合適的異常處理程序的過(guò)程就稱為“堆棧輾轉(zhuǎn)開(kāi)解”(Stack Unwinding)。解釋器一方面維護(hù)著與放置堆棧中的函數(shù)有關(guān)的信息,另一方面也維護(hù)著與已從堆棧中“輾轉(zhuǎn)開(kāi)解”的函數(shù)有關(guān)的信息。
格式:
try:
block
except:
traceback.print_exc()
示例:…excpetion/traceback.py
4. 采用sys模塊回溯最后的異常
import sys
try:
block
except:
info=sys.exc_info()
print info[0],”:”,info[1]
或者以如下的形式:
import sys
tp,val,td = sys.exc_info()
sys.exc_info()的返回值是一個(gè)tuple, (type, value/message, traceback)
這里的type —- 異常的類型
value/message —- 異常的信息或者參數(shù)
traceback —- 包含調(diào)用棧信息的對(duì)象。
從這點(diǎn)上可以看出此方法涵蓋了traceback.
5. 異常處理的一些其它用途
除了處理實(shí)際的錯(cuò)誤條件之外,對(duì)于異常還有許多其它的用處。在標(biāo)準(zhǔn) Python 庫(kù)中一個(gè)普通的用法就是試著導(dǎo)入一個(gè)模塊,然后檢查是否它能使用。導(dǎo)入一個(gè)并不存在的模塊將引發(fā)一個(gè) ImportError 異常。你可以使用這種方法來(lái)定義多級(jí)別的功能――依靠在運(yùn)行時(shí)哪個(gè)模塊是有效的,或支持多種平臺(tái) (即平臺(tái)特定代碼被分離到不同的模塊中)。
你也能通過(guò)創(chuàng)建一個(gè)從內(nèi)置的 Exception 類繼承的類定義你自己的異常,然后使用 raise 命令引發(fā)你的異常。如果你對(duì)此感興趣,請(qǐng)看進(jìn)一步閱讀的部分。
下面的例子演示了如何使用異常支持特定平臺(tái)功能。代碼來(lái)自 getpass 模塊,一個(gè)從用戶獲得口令的封裝模塊。獲得口令在 UNIX、Windows 和 Mac OS 平臺(tái)上的實(shí)現(xiàn)是不同的,但是這個(gè)代碼封裝了所有的不同之處。
例支持特定平臺(tái)功能
# Bind the name getpass to the appropriate function
try:
import termios, TERMIOS
except ImportError:
try:
import msvcrt
except ImportError:
try:
from EasyDialogs import AskPassword
except ImportError:
getpass = default_getpass
else:
getpass = AskPassword
else:
getpass = win_getpass
else:
getpass = unix_getpass
termios 是 UNIX 獨(dú)有的一個(gè)模塊,它提供了對(duì)于輸入終端的底層控制。如果這個(gè)模塊無(wú)效 (因?yàn)樗辉谀愕南到y(tǒng)上,或你的系統(tǒng)不支持它),則導(dǎo)入失敗,Python 引發(fā)我們捕捉的 ImportError 異常。
OK,我們沒(méi)有 termios,所以讓我們?cè)囋?msvcrt,它是 Windows 獨(dú)有的一個(gè)模塊,可以提供在 Microsoft Visual C++ 運(yùn)行服務(wù)中的許多有用的函數(shù)的一個(gè)API。如果導(dǎo)入失敗,Python 會(huì)引發(fā)我們捕捉的 ImportError 異常。
如果前兩個(gè)不能工作,我們?cè)囍鴱?EasyDialogs 導(dǎo)入一個(gè)函數(shù),它是 Mac OS 獨(dú)有的一個(gè)模塊,提供了各種各樣類型的彈出對(duì)話框。再一次,如果導(dǎo)入失敗,Python 會(huì)引發(fā)一個(gè)我們捕捉的 ImportError 異常。
這些平臺(tái)特定的模塊沒(méi)有一個(gè)有效 (有可能,因?yàn)?Python 已經(jīng)移植到了許多不同的平臺(tái)上了),所以我們需要回頭使用一個(gè)缺省口令輸入函數(shù) (這個(gè)函數(shù)定義在 getpass 模塊中的別的地方)。注意我們?cè)谶@里所做的:我們將函數(shù) default_getpass 賦給變量 getpass。如果你讀了官方 getpass 文檔,它會(huì)告訴你 getpass 模塊定義了一個(gè) getpass 函數(shù)。它是這樣做的:通過(guò)綁定 getpass 到正確的函數(shù)來(lái)適應(yīng)你的平臺(tái)。然后當(dāng)你調(diào)用 getpass 函數(shù)時(shí),你實(shí)際上調(diào)用了平臺(tái)特定的函數(shù),是這段代碼已經(jīng)為你設(shè)置好的。你不需要知道或關(guān)心你的代碼正運(yùn)行在何種平臺(tái)上;只要調(diào)用 getpass,則它總能正確處理。
一個(gè) try…except 塊可以有一條 else 子句,就像 if 語(yǔ)句。如果在 try 塊中沒(méi)有異常引發(fā),然后 else 子句被執(zhí)行。在本例中,那就意味著如果 from EasyDialogs import AskPassword 導(dǎo)入可工作,所以我們應(yīng)該綁定 getpass 到 AskPassword 函數(shù)。其它每個(gè) try…except 塊有著相似的 else 子句,當(dāng)我們發(fā)現(xiàn)一個(gè) import 可用時(shí),就綁定 getpass 到適合的函數(shù)。
數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
LSTM 模型輸入長(zhǎng)度選擇技巧:提升序列建模效能的關(guān)鍵? 在循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)家族中,長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM)憑借其解決長(zhǎng)序列 ...
2025-07-11CDA 數(shù)據(jù)分析師報(bào)考條件詳解與準(zhǔn)備指南? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代浪潮下,CDA 數(shù)據(jù)分析師認(rèn)證愈發(fā)受到矚目,成為眾多有志投身數(shù) ...
2025-07-11數(shù)據(jù)透視表中兩列相乘合計(jì)的實(shí)用指南? 在數(shù)據(jù)分析的日常工作中,數(shù)據(jù)透視表憑借其強(qiáng)大的數(shù)據(jù)匯總和分析功能,成為了 Excel 用戶 ...
2025-07-11尊敬的考生: 您好! 我們誠(chéng)摯通知您,CDA Level I和 Level II考試大綱將于 2025年7月25日 實(shí)施重大更新。 此次更新旨在確保認(rèn) ...
2025-07-10BI 大數(shù)據(jù)分析師:連接數(shù)據(jù)與業(yè)務(wù)的價(jià)值轉(zhuǎn)化者? ? 在大數(shù)據(jù)與商業(yè)智能(Business Intelligence,簡(jiǎn)稱 BI)深度融合的時(shí)代,BI ...
2025-07-10SQL 在預(yù)測(cè)分析中的應(yīng)用:從數(shù)據(jù)查詢到趨勢(shì)預(yù)判? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代,預(yù)測(cè)分析作為挖掘數(shù)據(jù)潛在價(jià)值的核心手段,正被廣泛 ...
2025-07-10數(shù)據(jù)查詢結(jié)束后:分析師的收尾工作與價(jià)值深化? ? 在數(shù)據(jù)分析的全流程中,“query end”(查詢結(jié)束)并非工作的終點(diǎn),而是將數(shù) ...
2025-07-10CDA 數(shù)據(jù)分析師考試:從報(bào)考到取證的全攻略? 在數(shù)字經(jīng)濟(jì)蓬勃發(fā)展的今天,數(shù)據(jù)分析師已成為各行業(yè)爭(zhēng)搶的核心人才,而 CDA(Certi ...
2025-07-09【CDA干貨】單樣本趨勢(shì)性檢驗(yàn):捕捉數(shù)據(jù)背后的時(shí)間軌跡? 在數(shù)據(jù)分析的版圖中,單樣本趨勢(shì)性檢驗(yàn)如同一位耐心的偵探,專注于從單 ...
2025-07-09year_month數(shù)據(jù)類型:時(shí)間維度的精準(zhǔn)切片? ? 在數(shù)據(jù)的世界里,時(shí)間是最不可或缺的維度之一,而year_month數(shù)據(jù)類型就像一把精準(zhǔn) ...
2025-07-09CDA 備考干貨:Python 在數(shù)據(jù)分析中的核心應(yīng)用與實(shí)戰(zhàn)技巧? ? 在 CDA 數(shù)據(jù)分析師認(rèn)證考試中,Python 作為數(shù)據(jù)處理與分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 檢驗(yàn):數(shù)據(jù)趨勢(shì)與突變分析的有力工具? ? ? 在數(shù)據(jù)分析的廣袤領(lǐng)域中,準(zhǔn)確捕捉數(shù)據(jù)的趨勢(shì)變化以及識(shí)別 ...
2025-07-08備戰(zhàn) CDA 數(shù)據(jù)分析師考試:需要多久?如何規(guī)劃? CDA(Certified Data Analyst)數(shù)據(jù)分析師認(rèn)證作為國(guó)內(nèi)權(quán)威的數(shù)據(jù)分析能力認(rèn)證 ...
2025-07-08LSTM 輸出不確定的成因、影響與應(yīng)對(duì)策略? 長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM)作為循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的一種變體,憑借獨(dú)特的門控機(jī)制,在 ...
2025-07-07統(tǒng)計(jì)學(xué)方法在市場(chǎng)調(diào)研數(shù)據(jù)中的深度應(yīng)用? 市場(chǎng)調(diào)研是企業(yè)洞察市場(chǎng)動(dòng)態(tài)、了解消費(fèi)者需求的重要途徑,而統(tǒng)計(jì)學(xué)方法則是市場(chǎng)調(diào)研數(shù) ...
2025-07-07CDA數(shù)據(jù)分析師證書考試全攻略? 在數(shù)字化浪潮席卷全球的當(dāng)下,數(shù)據(jù)已成為企業(yè)決策、行業(yè)發(fā)展的核心驅(qū)動(dòng)力,數(shù)據(jù)分析師也因此成為 ...
2025-07-07剖析 CDA 數(shù)據(jù)分析師考試題型:解鎖高效備考與答題策略? CDA(Certified Data Analyst)數(shù)據(jù)分析師考試作為衡量數(shù)據(jù)專業(yè)能力的 ...
2025-07-04SQL Server 字符串截取轉(zhuǎn)日期:解鎖數(shù)據(jù)處理的關(guān)鍵技能? 在數(shù)據(jù)處理與分析工作中,數(shù)據(jù)格式的規(guī)范性是保證后續(xù)分析準(zhǔn)確性的基礎(chǔ) ...
2025-07-04CDA 數(shù)據(jù)分析師視角:從數(shù)據(jù)迷霧中探尋商業(yè)真相? 在數(shù)字化浪潮席卷全球的今天,數(shù)據(jù)已成為企業(yè)決策的核心驅(qū)動(dòng)力,CDA(Certifie ...
2025-07-04CDA 數(shù)據(jù)分析師:開(kāi)啟數(shù)據(jù)職業(yè)發(fā)展新征程? ? 在數(shù)據(jù)成為核心生產(chǎn)要素的今天,數(shù)據(jù)分析師的職業(yè)價(jià)值愈發(fā)凸顯。CDA(Certified D ...
2025-07-03