引發和處理異常情況
這是 Python 2 語法,請注意 raise
和 except
行上的逗號 ,
:
Python 2.x >= 2.3
try:
raise IOError, "input/output error"
except IOError, exc:
print exc
在 Python 3 中,刪除了 ,
語法,並用括號和 as
關鍵字替換:
try:
raise IOError("input/output error")
except IOError as exc:
print(exc)
為了向後相容,Python 3 語法也可以在 Python 2.6 以後使用,因此它應該用於所有不需要與以前版本相容的新程式碼。
Python 3.x >= 3.0
Python 3 還新增了異常連結 ,其中你可以發訊號通知其他異常是導致此異常的原因。例如
try:
file = open('database.db')
except FileNotFoundError as e:
raise DatabaseError('Cannot open {}') from e
except
語句中引發的異常是 DatabaseError
型別,但原始異常標記為該異常的 __cause__
屬性。顯示回溯時,原始異常也將顯示在回溯中:
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
FileNotFoundError
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
DatabaseError('Cannot open database.db')
如果你在沒有明確連結的情況下投入 except
塊 :
try:
file = open('database.db')
except FileNotFoundError as e:
raise DatabaseError('Cannot open {}')
追溯是
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
FileNotFoundError
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
DatabaseError('Cannot open database.db')
Python 2.x >= 2.0
Python 2.x 中都不支援任何一個; 如果在 except 塊中引發另一個異常,則原始異常及其回溯將丟失。以下程式碼可用於相容性:
import sys
import traceback
try:
funcWithError()
except:
sys_vers = getattr(sys, 'version_info', (0,))
if sys_vers < (3, 0):
traceback.print_exc()
raise Exception("new exception")
Python 3.x >= 3.3
要忘記之前丟擲的異常,請使用 raise from None
try:
file = open('database.db')
except FileNotFoundError as e:
raise DatabaseError('Cannot open {}') from None
現在回溯就是這樣
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
DatabaseError('Cannot open database.db')
或者為了使它與 Python 2 和 3 相容,你可以像這樣使用六個包:
import six
try:
file = open('database.db')
except FileNotFoundError as e:
six.raise_from(DatabaseError('Cannot open {}'), None)