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