try-finally 語句無論是否發生異常都將執行最後的**。
以下例題中 finally 語句無論異常是否發生都會執行:
例題:
try:
runoob()
except assertionerror as error:
print(error)
else:
try:
with open('file.log') as file:
read_data = file.read()
except filenotfounderror as fnf_error:
print(fnf_error)
finally:
print('這句話,無論異常是否發生都會執行。')
python 使用 raise 語句丟擲乙個指定的異常。
raise語法格式如下:
以下例題中如果 x 大於 5 就觸發異常:
x = 10
if x > 5:
raise exception('x 不能大於 5。x 的值為: {}'.format(x))
執行以上**會觸發異常:
traceback (most recent call last):
file "test.py", line 3, in
raise exception('x 不能大於 5。x 的值為: {}'.format(x))
exception: x 不能大於 5。x 的值為: 10
raise 唯一的乙個引數指定了要被丟擲的異常。它必須是乙個異常的例項或者是異常的類(也就是 exception 的子類)。
如果你只想知道這是否丟擲了乙個異常,並不想去處理它,那麼乙個簡單的 raise 語句就可以再次把它丟擲。
try:
raise nameerror('hi,there')
except nameerror:
print('an exception flew by!')
raise
an exception flew by!
traceback (most recent call last):
file "", line 2, in ?
nameerror: hithere
你可以通過建立乙個新的異常類來擁有自己的異常。異常類繼承自 exception 類,可以直接繼承,或者間接繼承,例如:
class myerror(exception):
def __init__(self, value):
self.value = value
def __str__(self):
return repr(self.value)
try:
raise myerror(2*2)
except myerror as e:
print('my exception occurred, value:', e.value)
my exception occurred, value: 4
raise myerror('oops!')
traceback (most recent call last):
file "", line 1, in ?
__main__.myerror: 'oops!'
在這個例子中,類 exception 預設的 __init__() 被覆蓋。
當建立乙個模組有可能丟擲多種不同的異常時,一種通常的做法是為這個包建立乙個基礎異常類,然後基於這個基礎類為不同的錯誤情況建立不同的子類:
class error(exception):
"""base class for exceptions in this module."""
pass
class inputerror(error):
"""exception raised for errors in the input.
attributes:
expression -- input expression in which the error occurred
message -- explanation of the error
"""def __init__(self, expression, message):
self.expression = expression
self.message = message
class transitionerror(error):
"""raised when an operation attempts a state transition that's not
allowed.
attributes:
previous -- state at beginning of transition
next -- attempted new state
message -- explanation of why the specific transition is not allowed
"""def __init__(self, previous, next, message):
self.previous = previous
self.next = next
self.message = message
大多數的異常的名字都以"error"結尾,就跟標準的異常命名一樣。
try 語句還有另外乙個可選的子句,它定義了無論在任何情況下都會執行的清理行為。 例如:
try:
raise keyboardinterrupt
finally:
print('goodbye, world!')
goodbye, world!
traceback (most recent call last):
file "", line 2, in
keyboardinterrupt
以上例子不管 try 子句裡面有沒有發生異常,finally 子句都會執行。
如果乙個異常在 try 子句裡(或者在 except 和 else 子句裡)被丟擲,而又沒有任何的 except 把它截住,那麼這個異常會在 finally 子句執行後被丟擲。
下面是乙個更加複雜的例子(在同乙個 try 語句裡包含 except 和 finally 子句):
def divide(x, y):
try:
result = x / y
except zerodivisionerror:
print("division by zero!")
else:
print("result is", result)
finally:
print("executing finally clause")
divide(2, 1)
result is 2.0
executing finally clause
divide(2, 0)
division by zero!
executing finally clause
divide("2", "1")
executing finally clause
traceback (most recent call last):
file "", line 1, in ?
file "", line 3, in divide
typeerror: unsupported operand type(s) for /: 'str' and 'str'
一些物件定義了標準的清理行為,無論系統是否成功的使用了它,一旦不需要它了,那麼這個標準的清理行為就會執行。
這面這個例子展示了嘗試開啟乙個檔案,然後把內容列印到螢幕上:
for line in open("myfile.txt"):
print(line, end="")
以上這段**的問題是,當執行完畢後,檔案會保持開啟狀態,並沒有被關閉。
with open("myfile.txt") as f:
for line in f:
print(line, end="")
以上這段**執行完畢後,就算在處理過程**問題了,檔案 f 總是會關閉。
第十章 異常處理
異常即是乙個事件,該事件會在程式執行過程中發生,影響了程式的正常執行。一般情況下,在python無法正常處理程式時就會發生乙個異常。異常是python物件,表示乙個錯誤。當python指令碼發生異常時我們需要捕獲處理它,否則程式會終止執行。捕捉異常可以使用try except語句。try excep...
第十章 檔案和異常
10 1 python 學習筆記 txt檔案 python 可以修 python 可以做遊戲 python 可以爬取資料.py檔案 filename scratch.txt with open filename,encoding utf 8 as file object contents file ...
從零學習C 第十章 異常處理
程式異常往往是沒有考慮到程式執行環境的一些特殊情況 關聯檔案時,檔案不存在 動態分配空間,記憶體不足 陣列下標溢位 除以0。程式的魯棒性 或健壯性,robustness 程式在各種極端情況下能正確執行。在程式中,對各種可預見的異常情況進行處理稱為異常處理 exception handling 就地處...