Python 提供了兩個非常重要的功能來處理 Python 程序中的任何意外錯誤并在其中添加調試功能 -
異常處理- 這將在本教程中介紹。這是 Python 中可用的標準異常列表:標準異常。
Assertions - 這將在 Python教程中的 Assertions 中介紹。
標準例外列表 -
編號 異常名稱和描述
1
例外
所有異常的基類
2
停止迭代
當迭代器的 next() 方法不指向任何對象時引發。
3
系統退出
由 sys.exit() 函數引發。
4
標準錯誤
除 StopIteration 和 SystemExit 之外的所有內置異常的基類。
5
算術錯誤
數值計算發生的所有錯誤的基類。
6
溢出錯誤
當計算超出數值類型的最大限制時引發。
7
浮點錯誤
當浮點計算失敗時引發。
8
零除法錯誤
當所有數字類型發生除零或模零時引發。
9
斷言錯誤
在 Assert 語句失敗的情況下引發。
10
屬性錯誤
在屬性引用或分配失敗的情況下引發。
11
EOF錯誤
當 raw_input() 或 input() 函數沒有輸入并且到達文件末尾時引發。
12
導入錯誤
當導入語句失敗時引發。
13
鍵盤中斷
當用戶中斷程序執行時引發,通常通過按 Ctrl+c。
14
查找錯誤
所有查找錯誤的基類。
15
索引錯誤
在序列中未找到索引時引發。
16
鍵錯誤
當在字典中找不到指定的鍵時引發。
17
名稱錯誤
在本地或全局命名空間中找不到標識符時引發。
18
UnboundLocalError
嘗試訪問函數或方法中的局部變量但未為其分配值時引發。
19
環境錯誤
在 Python 環境之外發生的所有異常的基類。
20
IO錯誤
當輸入/輸出操作失敗時引發,例如嘗試打開不存在的文件時的 print 語句或 open() 函數。
21
IO錯誤
針對與操作系統相關的錯誤引發。
22
語法錯誤
當 Python 語法出現錯誤時引發。
23
縮進錯誤
未正確指定縮進時引發。
24
系統錯誤
當解釋器發現內部問題時引發,但遇到此錯誤時 Python 解釋器不會退出。
25
系統退出
當使用 sys.exit() 函數退出 Python 解釋器時引發。如果未在代碼中處理,則導致解釋器退出。
26
類型錯誤
當嘗試對指定數據類型無效的操作或函數時引發。
27
值錯誤
當數據類型的內置函數具有有效的參數類型,但參數指定的值無效時引發。
28
運行時錯誤
當生成的錯誤不屬于任何類別時引發。
29
未實現錯誤
當需要在繼承的類中實現的抽象方法沒有實際實現時引發。
Python 中的斷言
斷言是一種健全性檢查,您可以在完成程序測試后打開或關閉它。
考慮斷言的最簡單方法是將其比作raise-if語句(或者更準確地說,是 raise-if-not 語句)。測試表達式,如果結果為假,則引發異常。
斷言由 assert 語句執行,它是 Python 的最新關鍵字,在 1.5 版中引入。
程序員經常在函數開頭放置斷言以檢查有效輸入,并在函數調用之后檢查有效輸出。
斷言聲明_
當遇到斷言語句時,Python 會計算伴隨的表達式,希望這是真的。如果表達式為假,Python 會引發AssertionError異常。
斷言的語法是 -
assert Expression[, Arguments]
如果斷言失敗,Python 使用 ArgumentExpression 作為 AssertionError 的參數。AssertionError 異??梢韵袷褂?try-except 語句的任何其他異常一樣被捕獲和處理,但如果不處理,它們將終止程序并產生回溯。
例子
這是一個將溫度從開爾文度轉換為華氏度的函數。由于開氏零度的溫度非常低,因此如果它看到負溫度,該功能就會退出 -
現場演示
#!/usr/bin/python
def KelvinToFahrenheit(Temperature):
assert (Temperature >= 0),"Colder than absolute zero!"
return ((Temperature-273)*1.8)+32
print KelvinToFahrenheit(273)
print int(KelvinToFahrenheit(505.78))
print KelvinToFahrenheit(-5)
執行上述代碼時,會產生以下結果 -
32.0
451
Traceback (most recent call last):
File "test.py", line 9, in <module>
print KelvinToFahrenheit(-5)
File "test.py", line 4, in KelvinToFahrenheit
assert (Temperature >= 0),"Colder than absolute zero!"
AssertionError: Colder than absolute zero!
什么是異常?
異常是在程序執行期間發生的事件,它破壞了程序指令的正常流程。通常,當 Python 腳本遇到無法應對的情況時,它會引發異常。異常是表示錯誤的 Python 對象。
當 Python 腳本引發異常時,它必須立即處理異常,否則它會終止并退出。
處理異常
如果您有一些可能引發異常的可疑代碼,您可以通過將可疑代碼放在try:塊中來保護您的程序。在 try: 塊之后,包含一個except:語句,然后是一個盡可能優雅地處理問題的代碼塊。
句法
這是try....except...else塊的簡單語法 -
try:
You do your operations here;
......................
except ExceptionI:
If there is ExceptionI, then execute this block.
except ExceptionII:
If there is ExceptionII, then execute this block.
......................
else:
If there is no exception then execute this block.
以下是關于上述語法的幾個要點 -
一個 try 語句可以有多個 except 語句。當 try 塊包含可能引發不同類型異常的語句時,這很有用。
您還可以提供一個通用的 except 子句,它處理任何異常。
在 except 子句之后,您可以包含一個 else 子句。如果 try: 塊中的代碼沒有引發異常,則執行 else 塊中的代碼。
else 塊是不需要 try: 塊保護的代碼的好地方。
例子
這個例子打開一個文件,在文件中寫入內容并優雅地出來,因為根本沒有問題 -
現場演示
#!/usr/bin/python
try:
fh = open("testfile", "w")
fh.write("This is my test file for exception handling!!")
except IOError:
print "Error: can\'t find file or read data"
else:
print "Written content in the file successfully"
fh.close()
這會產生以下結果 -
Written content in the file successfully
例子
此示例嘗試打開您沒有寫入權限的文件,因此會引發異常 -
現場演示
#!/usr/bin/python
try:
fh = open("testfile", "r")
fh.write("This is my test file for exception handling!!")
except IOError:
print "Error: can\'t find file or read data"
else:
print "Written content in the file successfully"
這會產生以下結果 -
Error: can't find file or read data
無例外的except子句
您還可以使用 except 語句,沒有異常定義如下 -
try:
You do your operations here;
......................
except:
If there is any exception, then execute this block.
......................
else:
If there is no exception then execute this block.
這種try-except語句會捕獲所有發生的異常。但是,使用這種 try-except 語句并不被認為是一種好的編程習慣,因為它會捕獲所有異常,但不會使程序員確定可能發生的問題的根本原因。
帶有多個例外的except子句
您還可以使用相同的except語句來處理多個異常,如下所示 -
try:
You do your operations here;
......................
except(Exception1[, Exception2[,...ExceptionN]]]):
If there is any exception from the given exception list,
then execute this block.
......................
else:
If there is no exception then execute this block.
try-finally 子句
您可以使用finally:塊和try:塊。finally 塊是放置任何必須執行的代碼的地方,無論 try 塊是否引發異常。try-finally 語句的語法是這樣的 -
try:
You do your operations here;
......................
Due to any exception, this may be skipped.
finally:
This would always be executed.
......................
您不能同時使用else子句和 finally 子句。
例子
現場演示
#!/usr/bin/python
try:
fh = open("testfile", "w")
fh.write("This is my test file for exception handling!!")
finally:
print "Error: can\'t find file or read data"
如果您無權以寫入模式打開文件,則會產生以下結果 -
Error: can't find file or read data
同樣的例子可以寫得更清楚如下 -
現場演示
#!/usr/bin/python
try:
fh = open("testfile", "w")
try:
fh.write("This is my test file for exception handling!!")
finally:
print "Going to close the file"
fh.close()
except IOError:
print "Error: can\'t find file or read data"
當try塊中拋出異常時,執行立即轉到finally塊。在finally塊中的所有語句都執行完之后,再次引發異常,如果出現在try-except語句的下一個更高層中,則在except語句中處理。
異常論證
異??梢杂幸粋€參數,它是一個提供有關問題的附加信息的值。參數的內容因例外而異。您可以通過在 except 子句中提供一個變量來捕獲異常的參數,如下所示 -
try:
You do your operations here;
......................
except ExceptionType, Argument:
You can print value of Argument here...
如果您編寫代碼來處理單個異常,則可以在 except 語句中的異常名稱后面添加一個變量。如果要捕獲多個異常,則可以在異常的元組后面添加一個變量。
這個變量接收異常的值,主要包含異常的原因。變量可以接收單個值或元組形式的多個值。該元組通常包含錯誤字符串、錯誤編號和錯誤位置。
例子
以下是單個異常的示例 -
現場演示
#!/usr/bin/python
# Define a function here.
def temp_convert(var):
try:
return int(var)
except ValueError, Argument:
print "The argument does not contain numbers\n", Argument
# Call above function here.
temp_convert("xyz");
這會產生以下結果 -
The argument does not contain numbers
invalid literal for int() with base 10: 'xyz'
引發異常
您可以使用 raise 語句以多種方式引發異常。raise語句的一般語法如下。
句法
raise [Exception [, args [, traceback]]]
這里,Exception是異常的類型(例如 NameError),argument是異常參數的值。參數是可選的;如果未提供,則異常參數為無。
最后一個參數 traceback 也是可選的(在實踐中很少使用),如果存在,它是用于異常的 traceback 對象。
例子
異??梢允亲址?、類或對象。Python 核心引發的大多數異常都是類,其參數是類的實例。定義新的異常非常容易,可以按如下方式完成 -
def functionName( level ):
if level < 1:
raise "Invalid level!", level
# The code below to this would not be executed
# if we raise the exception
注意:為了捕獲異常,“except”子句必須引用類對象或簡單字符串引發的相同異常。例如,要捕獲上述異常,我們必須編寫 except 子句如下 -
try:
Business Logic here...
except "Invalid level!":
Exception handling here...
else:
Rest of the code here...
用戶定義的異常
Python 還允許您通過從標準內置異常派生類來創建自己的異常。
這是一個與RuntimeError相關的示例。在這里,創建了一個從RuntimeError子類化的類。當您需要在捕獲異常時顯示更具體的信息時,這很有用。
在 try 塊中,引發用戶定義的異常并在 except 塊中捕獲。變量 e 用于創建類Networkerror的實例。
class Networkerror(RuntimeError):
def __init__(self, arg):
self.args = arg
所以一旦你定義了上面的類,你可以引發如下異常 -
try:
raise Networkerror("Bad hostname")
except Networkerror,e:
print e.args