引發和處理異常情況

這是 Python 2 語法,請注意 raiseexcept 行上的逗號 ,

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)