Python 錯誤和異常

2022-07-11 15:06:12 字數 4887 閱讀 1116

在編寫**的時候,先不管出於什麼原因,在執行階段,可能都看到過一些錯誤的資訊。這些資訊當中(至少)有兩種可區分的錯誤:語法錯誤異常

語法錯誤也叫解析錯誤,這可能在學習編碼中最容易遇到的錯誤:

>>> while true print('hello world')

file "", line 1

while true print('hello world')

^syntaxerror: invalid syntax

當出現錯誤時,直譯器會輸出出現語法錯誤的那行,同時會顯示 ^ 符號標記檢測到的錯誤。符號標記的位置表示錯誤出現在此處(或表示至少錯誤是在此處被檢測出)。在這個示例中,print() 函式被檢測出錯誤,這是因為前面的條件語句少了個冒號(:)。在錯誤資訊中,會出現行號以及檔名,這都能方便在出現錯誤的時候到相應的位置檢查。

有時候,檢查編寫的**發現並沒有什麼語法錯誤,但在執行時,還是會引發錯誤。這種在執行時檢測到的錯誤被稱為異常。大多數異常並不會被程式處理,會顯示如下的錯誤資訊:

>>> 10 / 0

traceback (most recent call last):

file "", line 1, in

zerodivisionerror: division by zero

>>> x + 4

traceback (most recent call last):

file "", line 1, in

nameerror: name 'x' is not defined

>>> 1 + '1'

traceback (most recent call last):

file "", line 1, in

typeerror: unsupported operand type(s) for +: 'int' and 'str'

如上示例,錯誤資訊最後一行會告訴我們程式遇到的是什麼型別的錯誤。在上面的例子中,出現的異常的型別分別是:zerodivisionerror、nameerror 和 typeerror。型別後面部分的資訊則表示根據異常型別及其原因提供詳細的資訊。

異常處理

python 內建 try...except... 錯誤處理機制。

用例子看下 try...except... 機制:

try:

r = 10 / 0

print('r=', r)

except zerodivisionerror as e:

print('except:', e)

print('end')

程式執行結果如下:

except: division by zero

end

在這裡說明一下 try 語句的工作原理:

在這個例子當中, try 子句中的 10 / 0 出現異常,故後面的 print() 子句的內容並沒有輸出。然後,與 except 後面的異常匹配,所以輸出異常資訊 except: division by zero,最後輸出整個 try 語句之後的 print('end') 語句。

這就是 try...except... 捕獲異常處理異常的大致原理。

try...except 語句後面還有乙個可選的 else 子句,使用時放在 except 子句後面。在 try 子句不發生異常時執行。對前面的例子進行一些修改,比如:

try:

r = 10 / 1

print('r=', r)

except zerodivisionerror as e:

print('except:', e)

else:

print('no error!')

print('end')

最終輸出的結果:

r= 10.0

no error!

end

丟擲異常

raise 語句允許編碼者強制丟擲指定異常。例如:

>>> raise nameerror('an error occurred here')

traceback (most recent call last):

file "", line 1, in

nameerror: an error occurred here

raise 唯一的引數就是要丟擲的異常。這個引數必須是乙個異常例項或者是乙個異常類(派生自 exception 的類)。

如果是打算確定是否發生了異常,但不打算處理的情況下,可以使用簡單的 raise 語句形式重新引發異常。比如:

>>> try:

... raise nameerror('an error occurred here.')

... except nameerror:

... print('an exception flew by!')

... raise

...an exception flew by!

traceback (most recent call last):

file "", line 2, in nameerror: an error occurred here.

自定義異常類

程式可以通過建立新的異常類來命名自己的異常。自定義異常類通常直接或間接從 exception 類派生。

class error(exception):

'''基類

'''pass

class inputerror(error):

'''輸入表示式錯誤時引發異常

attributes:

expression -- 輸入表示式

message -- 異常輸出的資訊

'''def __init__(self, expression, message):

self.expression = expression

self.message = message

class transitionerror(error):

'''狀態轉換不被允許時丟擲異常

attributes:

previous -- 轉換前的狀態

next -- 轉換後新的狀態

message -- 狀態轉換不被允許的說明

'''def __init__(self, previous, next, message):

self.previous = previous

self.next = next

self.message = message

一般情況下,自定義異常名稱都以 error 結尾,類似於標準異常的命名。

定義清理操作

try 語句還有乙個可選子句 finally。用於定義必須在所有情況下都執行的清理操作。例如:

>>> def divide(a, b):

... try:

... res = a / b

... except zerodivisionerror:

... print('division by zero!')

... else:

... print('res =', res)

... finally:

... print('executing finally clause')

...>>> divide(10, 1)

res = 10.0

executing finally clause

>>> divide(10, 0)

division by zero!

executing finally clause

>>> divide('10', '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'

在這裡,可以看到,無論什麼情況,finally 最終都會被執行。最後的例子中,由於兩個字串相除並沒有被 except 子句處理,這裡也在執行 finally 子句後,丟擲 typeerror 異常。

finally 子句對於釋放外部資源(比如讀寫檔案或者網路連線)非常有用,無論是否成功使用資源。

廣州品牌設計公司

預定義的清理操作

先看一段示例**:

for line in open('file.txt'):

print(line, end='')

其實這段**有乙個問題,它在這部分**執行結束之後,會在一段不確定的時候,讓 file 物件一直保持開啟的狀態。這裡可能對簡單的指令碼並沒有太大的影響,但若是程式足夠大的話,這裡將會是個問題。

python 提供乙個 with 語句,允許支援上下文管理協議的物件能夠確保它們得到及時和正確的清理:

with open('file.txt') as f:

for line in f:

print(line, end='')

在這裡,檔案 f 始終會被關閉,不至於浪費資源。

python錯誤和異常

1 語法錯誤 syntax errors 語法錯誤,也就是解析時錯誤。當我們寫出不符合python語法 時,在解析時會報syntaxerror,並且會顯示出錯的那一行,並用小箭頭知名指明最早探測到錯誤的位置。如 while ture file line 1 while ture syntaxerro...

Python 錯誤和異常

for i in range 10 print i for i in range 10 syntaxerror invalid syntax python的語法分析器完成,檢測到錯誤所在的檔案和行號,以向上箭頭標記錯誤位置,最後顯示錯誤型別 當程式檢測到乙個錯誤,直譯器就無法繼續執行下去,丟擲異常,...

Python錯誤和異常

語法錯誤是指python編譯器在編譯時出現的錯誤,語法分析器會指出出錯的一行並在最新出現問題的位置標記乙個小箭頭及錯誤提示 while true print hello world file haha.py line 1 while true syntaxerror invalid syntax 函...