第十章 異常處理下

2021-10-12 01:12:12 字數 4312 閱讀 6801

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 就地處...