python異常處理

2021-07-02 02:58:20 字數 4956 閱讀 3515

#!/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的異常處理能力是很強大的,可向使用者準確反饋出錯資訊。在python中,異常也是物件,可對它進行操作。所有異常都是基類exception的成員。所有異常都從基類exception繼承,而且都在exceptions模組中定義。python自動將所有異常名稱放在內建命名空間中,所以程式不必匯入exceptions模組即可使用異常。一旦引發而且沒有捕捉systemexit異常,程式執行就會終止。如果互動式會話遇到乙個未**捉的systemexit異常,會話就會終止。

方式一:try語句:

1使用try和except語句來捕獲異常

try:

block

except [exception,[data…]]:

block

try:

block

except [exception,[data...]]:

block

else:

block

該種異常處理語法的規則是:

·   執行try下的語句,如果引發異常,則執行過程會跳到第乙個except語句。

·   如果第乙個except中定義的異常與引發的異常匹配,則執行該except中的語句。

·   如果引發的異常不匹配第乙個except,則會搜尋第二個except,允許編寫的except數量沒有限制。

·   如果所有的except都不匹配,則異常會傳遞到下乙個呼叫本**的最高層try**中。

·   如果沒有發生異常,則執行else塊**。

例:try:

f = open(「file.txt」,」r」)

except ioerror, e:

print e

捕獲到的ioerror錯誤的詳細原因會被放置在物件e中,然後執行該異常的except**塊

捕獲所有的異常

try:

a=bb=c

except exception,ex:

print exception,":",ex

使用except子句需要注意的事情,就是多個except子句截獲異常時,如果各個異常類之間具有繼承關係,則子類應該寫在前面,否則父類將會直接截獲子類異常。放在後面的子類異常也就不會執行到了。

2 使用try跟finally:

語法如下:

try:

block

finally:

block

該語句的執行規則是:

·   執行try下的**。

·   如果發生異常,在該異常傳遞到下一級try時,執行finally中的**。

·   如果沒有發生異常,則執行finally中的**。

第二種try語法在無論有沒有發生異常都要執行**的情況下是很有用的。例如我們在python中開啟乙個檔案進行讀寫操作,我在操作過程中不管是否出現異常,最終都是要把該檔案關閉的。

這兩種形式相互衝突,使用了一種就不允許使用另一種,而功能又各異

2. 用raise語句手工引發乙個異常:

raise [exception[,data]]

在python中,要想引發異常,最簡單的形式就是輸入關鍵字raise,後跟要引發的異常的名稱。異常名稱標識出具體的類:python異常是那些類的物件。執行raise語句時,python會建立指定的異常類的乙個物件。raise語句還可指定對異常物件進行初始化的引數。為此,請在異常類的名稱後新增乙個逗號以及指定的引數(或者由引數構成的乙個元組)。

例:try:

raise myerror #自己丟擲乙個異常

except myerror:

print 'a error'

raise valueerror,』invalid argument』

捕捉到的內容為:

type = vauleerror

message = invalid argument

3.   採用traceback(跟蹤)模組檢視異常

發生異常時,python能「記住」引發的異常以及程式的當前狀態。python還維護著traceback(跟蹤)物件,其中含有異常發生時與函式呼叫堆疊有關的資訊。記住,異常可能在一系列巢狀較深的函式呼叫中引發。程式呼叫每個函式時,python會在「函式呼叫堆疊」的起始處插入函式名。一旦異常被引發,python會搜尋乙個相應的異常處理程式。如果當前函式中沒有異常處理程式,當前函式會終止執行,python會搜尋當前函式的呼叫函式,並以此類推,直到發現匹配的異常處理程式,或者python抵達主程式為止。這一查詢合適的異常處理程式的過程就稱為「堆疊輾轉開解」(stack unwinding)。直譯器一方面維護著與放置堆疊中的函式有關的資訊,另一方面也維護著與已從堆疊中「輾轉開解」的函式有關的資訊。

格式: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()的返回值是乙個tuple, (type, value/message, traceback)

這裡的type ---- 異常的型別

value/message ---- 異常的資訊或者引數

traceback ---- 包含呼叫棧資訊的物件。

從這點上可以看出此方法涵蓋了traceback.

5. 異常處理的一些其它用途

除了處理實際的錯誤條件之外,對於異常還有許多其它的用處。在標準 python 庫中乙個普通的用法就是試著匯入乙個模組,然後檢查是否它能使用。匯入乙個並不存在的模組將引發乙個 importerror 異常。你可以使用這種方法來定義多級別的功能――依靠在執行時哪個模組是有效的,或支援多種平台 (即平台特定**被分離到不同的模組中)。

你也能通過建立乙個從內建的 exception 類繼承的類定義你自己的異常,然後使用 raise 命令引發你的異常。如果你對此感興趣,請看進一步閱讀的部分。

下面的例子演示了如何使用異常支援特定平台功能。**來自 getpass 模組,乙個從使用者獲得口令的封裝模組。獲得口令在 unix、windows 和 mac os 平台上的實現是不同的,但是這個**封裝了所有的不同之處。

例支援特定平台功能

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 獨有的乙個模組,它提供了對於輸入終端的底層控制。如果這個模組無效 (因為它不在你的系統上,或你的系統不支援它),則匯入失敗,python 引發我們捕捉的 importerror 異常。

ok,我們沒有 termios,所以讓我們試試 msvcrt,它是 windows 獨有的乙個模組,可以提供在 microsoft visual c++ 執行服務中的許多有用的函式的乙個api。如果匯入失敗,python 會引發我們捕捉的 importerror 異常。

如果前兩個不能工作,我們試著從 easydialogs 匯入乙個函式,它是 mac os 獨有的乙個模組,提供了各種各樣型別的彈出對話方塊。再一次,如果匯入失敗,python 會引發乙個我們捕捉的 importerror 異常。

這些平台特定的模組沒有乙個有效 (有可能,因為 python 已經移植到了許多不同的平台上了),所以我們需要回頭使用乙個預設口令輸入函式 (這個函式定義在 getpass 模組中的別的地方)。注意我們在這裡所做的:我們將函式 default_getpass 賦給變數 getpass。如果你讀了官方 getpass 文件,它會告訴你 getpass 模組定義了乙個 getpass 函式。它是這樣做的:通過繫結 getpass 到正確的函式來適應你的平台。然後當你呼叫 getpass 函式時,你實際上呼叫了平台特定的函式,是這段**已經為你設定好的。你不需要知道或關心你的**正執行在何種平台上;只要呼叫 getpass,則它總能正確處理。

乙個 try...except 塊可以有一條 else 子句,就像 if 語句。如果在 try 塊中沒有異常引發,然後 else 子句被執行。在本例中,那就意味著如果 from easydialogs import askpassword 匯入可工作,所以我們應該繫結 getpass 到 askpassword 函式。其它每個 try...except 塊有著相似的 else 子句,當我們發現乙個 import 可用時,就繫結 getpass 到適合的函式。

python異常處理 Python 異常處理

使用者輸入不完整 比如輸入為空 或者輸入非法 輸入不是數字 異常就是程式執行時發生錯誤的訊號,在python中,錯誤觸發的異常如下 在python中不同的異常可以用不同的型別 python中統一了類與型別,型別即類 去標識,不同的類物件標識不同的異常,乙個異常標識一種錯 觸發indexerror 觸...

python異常舉例 Python異常處理

1.1異常問題舉例 例一 i input 請輸入數字 請輸入數字 0 print i print 5 int i traceback most recent call last file line 1,in zerodivisionerror division by zero 上述 的報錯是除零的錯...

python異常處理

當你的程式中出現異常情況時就需要異常處理。比如當你開啟乙個不存在的檔案時。當你的程式中有一些無效的語句時,python會提示你有錯誤存在。下面是乙個拼寫錯誤的例子,print寫成了print。python是大小寫敏感的,因此python將引發乙個錯誤 print hello world file l...