7 python異常處理 異常基類學習

2022-09-07 10:48:11 字數 3048 閱讀 1823

部分內容摘選自菜鳥教程

及《瘋狂python講義-李剛》

異常機制已經成為判斷一門語言是否成熟的標準。python的異常處理機制主要依賴try、except、else、finally和raise五個關鍵字,其中:

try語句按照如下方式工作;

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

如果沒有異常發生,忽略except子句,try子句執行後結束。

如果在執行try子句的過程中發生了異常,那麼try子句餘下的部分將被忽略。如果異常的型別和 except之後的名稱相符,那麼對應的except子句將被執行。最後執行try語句之後的**.

如果乙個異常沒有與任何的except匹配,那麼這個異常將會傳遞給上層的try中。

except語句不是必須的,finally語句也不是必須的,但二者必須要有乙個,否則就沒有try的意義了。

不建議在不清楚邏輯的情況下捕獲所有異常,有可能你隱藏了很嚴重的問題。

[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-kbqhdsa5-1580800177172)(542fc04789ac42b495b16fd2121948be)]

python 使用 raise 語句丟擲乙個指定的異常。

raise語法格式如下:

raise [exception [, args [, traceback]]]
以下例項如果 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('hithere')

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"結尾,就跟標準的異常命名一樣。

(7)Python 異常處理,檔案的讀寫

異常處理 print 異常出現前 l try print c l 10 1 hello print 10 0 except nameerror 如果except後不跟任何的內容,則此時它會捕獲到所有的異常 如果在except後跟著乙個異常的型別,那麼此時它只會捕獲該型別的異常 print 出現 na...

7 python全棧之路 異常處理

處理異常 排錯的時候 真正報錯的是最下面 python的 是不會出錯的,應該從下向上找最後一行自己寫的 去處理 異常處理的應用 1.可以用 if規避,但是成本太高。2.不能用 if處理了 stopiteration if 是預防異常出現的 try是異常出現之後 異常處理的特點 一旦發生異常,程式就不...

python異常處理 Python 異常處理

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