Python 內建異常



內建異常是 Python 中預定義的錯誤類,用於處理程式中的錯誤和異常情況。它們派生自基類“BaseException”,並且是標準庫的一部分。

Python 中標準內建異常

以下是 Python 中可用的標準異常列表 -

序號 異常名稱 & 描述
1

異常

所有異常的基類

2

StopIteration

當迭代器的 next() 方法不指向任何物件時引發。

3

SystemExit

由 sys.exit() 函式引發。

4

StandardError

除 StopIteration 和 SystemExit 之外,所有內建異常的基類。

5

ArithmeticError

所有發生在數值計算中的錯誤的基類。

6

OverflowError

當計算超出數值型別的最大限制時引發。

7

FloatingPointError

當浮點計算失敗時引發。

8

ZeroDivisonError

當對所有數值型別進行除法或取模運算時除數為零時引發。

9

AssertionError

在 Assert 語句失敗的情況下引發。

10

AttributeError

在屬性引用或賦值失敗的情況下引發。

11

EOFError

當 raw_input() 或 input() 函式沒有輸入並且到達檔案末尾時引發。

12

ImportError

當 import 語句失敗時引發。

13

KeyboardInterrupt

當用戶中斷程式執行時引發,通常是透過按下 Ctrl+C。

14

LookupError

所有查詢錯誤的基類。

15

IndexError

當在序列中找不到索引時引發。

16

KeyError

當在字典中找不到指定的鍵時引發。

17

NameError

當在本地或全域性名稱空間中找不到識別符號時引發。

18

UnboundLocalError

當嘗試訪問函式或方法中的區域性變數但未為其賦值時引發。

19

EnvironmentError

發生在 Python 環境之外的所有異常的基類。

20

IOError

當輸入/輸出操作失敗時引發,例如 print 語句或 open() 函式在嘗試開啟不存在的檔案時。

21

OSError

針對與作業系統相關的錯誤引發。

22

SyntaxError

當 Python 語法中存在錯誤時引發。

23

IndentationError

當縮排未正確指定時引發。

24

SystemError

當直譯器發現內部問題時引發,但是當遇到此錯誤時,Python 直譯器不會退出。

25

SystemExit

當 Python 直譯器使用 sys.exit() 函式退出時引發。如果程式碼中未處理,會導致直譯器退出。

26

TypeError

當嘗試對指定資料型別無效的操作或函式時引發。

27

ValueError

當資料型別的內建函式具有有效的引數型別,但引數具有指定的無效值時引發。

28

RuntimeError

當生成的錯誤不屬於任何類別時引發。

29

NotImplementedError

當需要在繼承類中實現的抽象方法實際上未實現時引發。

以下是一些標準異常的示例 -

IndexError

當嘗試訪問無效索引處的專案時顯示。

numbers=[10,20,30,40]
for n in range(5):
   print (numbers[n])

將產生以下輸出 -

10
20
30
40
Traceback (most recent call last):

   print (numbers[n])
IndexError: list index out of range

模組未找到錯誤

當無法找到模組時顯示此錯誤。

import notamodule
Traceback (most recent call last):

   import notamodule
ModuleNotFoundError: No module named 'notamodule'

KeyError

它發生在字典鍵未找到時。

D1={'1':"aa", '2':"bb", '3':"cc"}
print ( D1['4'])
Traceback (most recent call last):

   D1['4']
KeyError: '4'

ImportError

當指定的函式不可匯入時顯示此錯誤。

from math import cube
Traceback (most recent call last):

   from math import cube
ImportError: cannot import name 'cube'

StopIteration

當迭代器流耗盡後呼叫 next() 函式時,會出現此錯誤。

.it=iter([1,2,3])
next(it)
next(it)
next(it)
next(it)
Traceback (most recent call last):

   next(it)
StopIteration

TypeError

當運算子或函式應用於不合適的物件型別時顯示此錯誤。

print ('2'+2)
Traceback (most recent call last):

   '2'+2
TypeError: must be str, not int

ValueError

當函式的引數型別不合適時顯示此錯誤。

print (int('xyz'))
Traceback (most recent call last):

   int('xyz')
ValueError: invalid literal for int() with base 10: 'xyz'

NameError

當無法找到物件時遇到此錯誤。

print (age)
Traceback (most recent call last):

   age
NameError: name 'age' is not defined

零除錯誤

當除法中的第二個運算數為零時顯示此錯誤。

x=100/0
Traceback (most recent call last):

   x=100/0
ZeroDivisionError: division by zero

KeyboardInterrupt

當用戶在程式執行過程中按下中斷鍵(通常是 Control-C)時。

name=input('enter your name')
enter your name^c
Traceback (most recent call last):

   name=input('enter your name')
KeyboardInterrupt

內建異常的層次結構

Python 中的異常以層次結構組織,頂部是“BaseException”。以下是一個簡化的層次結構:

  • BaseException
    • SystemExit
    • KeyboardInterrupt
  • 異常
    • ArithmeticError
      • FloatingPointError
      • OverflowError
      • 零除錯誤
    • AttributeError
    • EOFError
    • ImportError
    • LookupError
      • IndexError
      • KeyError
    • MemoryError
    • NameError
      • UnboundLocalError
    • OSError
      • FileNotFoundError
    • TypeError
    • ValueError
    • ---(還有許多其他異常)---

如何使用內建異常

我們已經知道 Python 中的內建異常是預定義的類,用於處理特定的錯誤條件。現在,以下是如何在 Python 程式中有效使用它們的詳細指南:

使用 try-except 塊處理異常

在 Python 中處理異常的主要方法是使用“try-except”塊。這允許您捕獲並響應程式碼執行期間可能發生的異常。

示例

在以下示例中,可能引發異常的程式碼放置在“try”塊中。“except”塊捕獲指定的異常“ZeroDivisionError”並進行處理。

try:
   result = 1 / 0
except ZeroDivisionError as e:
   print(f"Caught an exception: {e}")

以下是獲得的輸出:

Caught an exception: division by zero

處理多個異常

您可以透過在“except”塊中以元組的形式指定多個異常來處理多個異常,如下面的示例所示:

try:
   result = int('abc')
except (ValueError, TypeError) as e:
   print(f"Caught a ValueError or TypeError: {e}")

以上程式碼的輸出如下所示:

Caught a ValueError or TypeError: invalid literal for int() with base 10: 'abc'

使用“else”和“finally”塊

如果“try”子句中的程式碼塊沒有引發異常,則執行“else”塊:

try:
   number = int(input("Enter a number: "))
except ValueError as e:
   print(f"Invalid input: {e}")
else:
   print(f"You entered: {number}")

以上程式碼的輸出根據給定的輸入而有所不同:

Enter a number: bn
Invalid input: invalid literal for int() with base 10: 'bn'

無論是否發生異常,“finally”塊都會始終執行。它通常用於清理操作,例如關閉檔案或釋放資源:

try:
   file = open('example.txt', 'r')
   content = file.read()
except FileNotFoundError as e:
   print(f"File not found: {e}")
finally:
   file.close()
   print("File closed.")

以下是以上程式碼的輸出:

File closed.

顯式引發內建異常

在 Python 中,您可以引發內建異常來指示程式碼中的錯誤或異常情況。這允許您處理特定的錯誤場景,並向用戶或除錯應用程式的開發人員提供資訊豐富的錯誤訊息。

語法

以下是引發內建異常的基本語法:

raise ExceptionClassName("Error message")

示例

在此示例中,“divide”函式嘗試除兩個數字“a”和“b”。如果“b”為零,則會引發“ZeroDivisionError”並顯示自定義訊息:

def divide(a, b):
   if b == 0:
      raise ZeroDivisionError("Cannot divide by zero")
   return a / b

try:
   result = divide(10, 0)
except ZeroDivisionError as e:
   print(f"Error: {e}")

獲得的輸出如下所示:

Error: Cannot divide by zero
廣告