程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python 異常處理篇

編輯:Python


文章目錄

  • 語法錯誤和異常之間的區別
  • 常見的錯誤類型有哪些?
  • 常見的異常有哪些?
  • 捕獲異常
  • 如何捕獲特定異常,語法
  • else 如果不出現異常執行
  • finally 無論如何都會執行
  • Raising Exception 主動拋出異常

Python中的錯誤可以有兩種類型,即語法錯誤和異常。錯誤是程序中的問題,由於該問題,程序將停止執行。另一方面,當發生一些內部事件時,會引發異常,這些事件會改變程序的正常流程

語法錯誤和異常之間的區別

語法錯誤: 顧名思義,此錯誤是由代碼中的語法錯誤引起的。它導致程序終止。
例:

# 始化amount變量
amount = 10000
if (amount > 2999)
print("hallo world")

輸出:

異常: 當程序在語法上正確,但代碼導致錯誤時,會引發異常。此錯誤不會停止程序的執行,但是,它會更改程序的正常流。
例:

# 初始化 marks 變量
marks = 10000
# 使用0執行除法
a = marks / 0
print(a)

輸出:

在上面的示例中,當我們嘗試將數字除以0時,報了除以0的錯誤

注意: 異常是 Python 中所有異常的基類。可以在此處檢查異常層次結構。

常見的錯誤類型有哪些?

  • IOError: 如果無法打開文件
  • KeyboardInterrupt: 當用戶按下不需要的鍵時
  • ValueError: 當內置函數收到錯誤的參數時
  • EOFError: 如果在未讀取任何數據的情況下命中文件末尾
  • ImportError: 如果找不到模塊

常見的異常有哪些?

異常名稱描述IndexError檢索到列表的錯誤索引時。AssertionError當斷言語句失敗時發生此問題AttributeError當屬性分配失敗時,將發生此錯誤。ImportError當找不到導入的模塊時,會發生這種情況。KeyError當找不到字典的鍵時,就會發生這種情況。NameError當變量未定義時,將發生此錯誤。MemoryError當程序內存不足時,就會發生這種情況。TypeError當以不正確的類型應用函數和操作時,就會發生這種情況。

捕獲異常

try 和 except 語句用於捕獲和處理 Python 中的異常。可以引發異常的語句保留在 try 子句中,處理異常的語句寫在 except 子句中。

例: 讓我們嘗試訪問其索引越界的數組元素並處理相應的異常。

# 處理簡單運行時錯誤的Python程序
# Python 3
a = [1, 2, 3]
try:
print("Second element = %d" % (a[1]))
# 由於數組中只有3個元素,因此引發錯誤
print("Fourth element = %d" % (a[3]))
except:
print("索引超出范圍")

在上面的示例中,可能導致錯誤的語句放置在 try 語句(在本例中為第二個 print 語句)中。第二個 print 語句嘗試訪問列表中不存在的第四個元素,這會引發異常。然後,此異常由 except 語句捕獲。

如何捕獲特定異常,語法

try 語句可以有多個 except 子句,以便為不同的異常指定處理程序。請注意,最多將執行一個處理程序。例如,我們可以在上面的代碼中添加 IndexError。添加特定異常的一般語法是 –

# 處理簡單運行時錯誤的Python程序
# Python 3
try:
#可能引發異常的語句
...
except IndexError:
# 發生索引異常後運行的語句
...
except ValueError:
# 發生值異常後運行的語句
...

例: 在 Python 中捕獲特定異常

# Program to handle multiple errors with one
# except statement
# Python 3
def fun(a):
if a < 4:
# throws ZeroDivisionError for a = 3
b = a / (a - 3)
# throws NameError if a >= 4
print("Value of b = ", b)
try:
fun(3)
fun(5)
# note that braces () are necessary here for
# multiple exceptions
except ZeroDivisionError:
print("發生了ZeroDivisionError")
except NameError:
print("發生了NameError")

輸出

如果將fun(3) 注釋掉,輸出將會是:

上面的輸出之所以如此,是因為一旦python嘗試訪問b的值,就會發生NameError。

else 如果不出現異常執行

在python中,您還可以在 try-except 塊上使用 else 子句,該子句必須在所有 except 子句之後存在。僅當 try 子句未引發異常時,代碼才會進入 else 塊。

例: 嘗試使用 else 子句

# 用try-except描述else子句的程序
# Python 3
# 返回a/b的函數
def AbyB(a, b):
try:
c = ((a + b) / (a - b))
except ZeroDivisionError:
print("不能除以0")
else:
print(c)
if __name__ == '__main__':
# 用於測試上述功能的驅動程序
AbyB(2.0, 3.0)
AbyB(3.0, 3.0)

輸出:

finally 無論如何都會執行

Python提供了一個關鍵字 finally,該關鍵字始終在try後執行。 finally 始終在try塊正常終止後執行,或者在某些異常而終止之後執行。
語法:

try:
# 可能出現異常的代碼....
...
except:
# 捕獲異常
# 異常之後執行的代碼
...
else:
# 如果不出現異常之後執行的代碼
...
finally:
# 無論如何都會執行的代碼
...

例:

# Python程序最終演示
# try塊中未引發異常
try:
k = 5 // 0 # 引發“除以零”異常。
print(k)
# 處理零除法異常
except ZeroDivisionError:
print("不能除以 0 ")
finally:
# 始終執行此代碼
# 無論是否生成異常。
print('這句話無論是否出現異常都會執行')

輸出結果:

Raising Exception 主動拋出異常

raise 語句允許程序員強制發生特定的異常。raise 中的唯一參數表示要提出的例外情況。這必須是異常實例或異常類(從 Exception 派生的類)。

# 描述引發異常的程序
try:
raise NameError("Hi there") # 拋出 Error
except NameError:
print("這是我主動拋出的異常")
raise # 確定是否引發了異常

輸出:


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved