Python異常處理

2021-09-24 09:35:35 字數 3641 閱讀 2087

try 語句按如下方式工作:

首先,執行 try 子句 (在 try 和 except 關鍵字之間的部分)。

如果沒有異常發生, except 子句 在 try 語句執行完畢後就被忽略了。

如果在 try 子句執行過程中發生了異常,那麼該子句其餘的部分就會被忽略。

如果異常匹配於 except 關鍵字後面指定的異常型別,就執行對應的except子句。然後繼續執行 try 語句之後的**。

如果發生了乙個異常,在 except 子句中沒有與之匹配的分支,它就會傳遞到上一級 try 語句中。

如果最終仍找不到對應的處理語句,它就成為乙個 未處理異常,終止程式執行,顯示提示資訊。

乙個 try 語句可能包含多個 except 子句,分別指定處理不同的異常。至多只會有乙個分支被執行。異常處理程式只會處理對應的 try 子句中發生的異常,在同乙個 try 語句中,其他子句中發生的異常則不作處理。

乙個 except 子句可以在括號中列出多個異常的名字

import sys

try:

f =open

('myfile.txt'

) s = f.readline(

) i =

int(s.strip())

except oserror as err:

print

("os error: "

.format

(err)

)except valueerror:

print

("could not convert data to an integer."

)except

:print

("unexpected error:"

, sys.exc_info()[

0])raise

try … except 語句可以帶有乙個 else子句,該子句只能出現在所有 except 子句之後。當 try 語句沒有丟擲異常時,需要執行一些**,可以使用這個子句。

import sys

for arg in sys.ar**[1:

]:try:

f =open

(arg,

'r')

except ioerror:

print

('cannot open'

, arg)

else

:print

(arg,

'has'

,len

(f.readlines())

,'lines'

) f.close(

)

使用 else 子句比在 try 子句中附加**要好,因為這樣可以避免 try … except 意外的截獲本來不屬於它們保護的那些**丟擲的異常。

發生異常時,可能會有乙個附屬值,作為異常的 引數 存在。這個引數是否存在、是什麼型別,依賴於異常的型別。

在異常名(列表)之後,也可以為 except 子句指定乙個變數。這個變數繫結於乙個異常例項,它儲存在instance.args 的引數中。為了方便起見,異常例項定義了str() ,這樣就可以直接訪問過列印引數而不必引用 .args 。這種做法不受鼓勵。相反,更好的做法是給異常傳遞乙個引數(如果要傳遞多個引數,可以傳遞乙個元組),把它繫結到 message 屬性。一旦異常發生,它會在丟擲前繫結所有指定的屬性。

異常處理器不僅僅處理那些在 try 子句中立刻發生的異常,也會處理那些 try 子句中呼叫的函式內部發生的異常。

def

fail()

: x =1/

0try

: fail(

)except zerodivisionerror as err:

print

('handle run-time error:'

,err)

python中使用raise丟擲異常

raise nameerror(

'hithere'

)

要丟擲的異常由 raise 的唯一引數標識。它必需是乙個異常例項或異常類(繼承自 exception 的類)。

如果你需要明確乙個異常是否丟擲,但不想處理它,raise 語句可以讓你很簡單的重新丟擲該異常

在程式中可以通過建立新的異常型別來命名自己的異常(python 類的內容請參見 類 )。異常類通常應該直接或間接的從 exception 類派生

class

myerror

(exception)

:def

__init__

(self, value)

: self.value = value

def__str__

(self)

:return

repr

(self.value)

在這個例子中,exception 預設的init() 被覆蓋。新的方式簡單的建立 value 屬性。這就替換了原來建立args 屬性的方式。

異常類中可以定義任何其它類中可以定義的東西,但是通常為了保持簡單,只在其中加入幾個屬性資訊,以供異常處理控制代碼提取。如果乙個新建立的模組中需要丟擲幾種不同的錯誤時,乙個通常的作法是為該模組定義乙個異常基類,然後針對不同的錯誤型別派生出對應的異常子類

try 語句還有另乙個可選的子句,目的在於定義在任何情況下都一定要執行的功能

不管有沒有發生異常,finally子句 在程式離開 try 後都一定會被執行。當 try 語句中發生了未被 except 捕獲的異常(或者它發生在 except 或 else 子句中),在 finally 子句執行完後它會被重新丟擲。 try 語句經由break ,continue 或 return 語句退 出也一樣會執行 finally 子句。

def

fail()

: x =1/

0try

: fail(

)except zerodivisionerror as err:

print

('handle run-time error:'

,err)

finally

:print

('executing end'

)

with 語句使得檔案之類的物件可以確保總能及時準確地進行清理

with

open

("myfile.txt"

)as f:

for line in f:

print

(line)

語句執行後,檔案 f 總會被關閉,即使是在處理檔案中的資料時出錯也一樣。其它物件是否提供了預定義的清理行為要檢視它們的文件

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...