Python3.2官方文件翻譯--異常丟擲和自定義異常
6.4 丟擲異常
Raise語句執行程式設計師強制丟擲一個具體的異常。例如:
>>> raise NameError(’HiThere’)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: HiThere
Raise的唯一引數描述了將要丟擲的異常。這可以是一個異常的例項或者一個異常類。(繼承Exception類)
如果你想要判定是否丟擲了一個異常但是不想處理它,raise語句有種簡單的形式可以幫助你重新丟擲異常。
>>> try:
... raise NameError(’
... except NameError:
... print(’An exception flew by!’)
... raise
...
An exception flew by!
Traceback (most recent call last):
File "<stdin>", line 2, in ?
NameError: HiThere
6.5 使用者自定義異常
程式設計師可以通過建立一個新異常類定義自己的異常。異常類要求直接或者間接繼承exception類。
>>> class MyError(Exception):
... def __init__(self, value):
... self.value = value
... def __str__(self):
... return repr(self.value)
...
>>> try:
... raise MyError(2
*
2)
... except MyError as e:
... print(’My exception occurred, value:’, e.value)
...
My exception occurred, value: 4
>>> raise MyError(’oops!’)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
__main__.MyError: ’oops!’
在這個例子中,異常Exception類中預設的方法_init_()被重寫了。新作用就是簡單建立一個value的屬性。這替換了建立args屬性的預設行為。
異常類可以定義其他類做的任何事情。但是常常比較簡單,僅僅提供一些讓異常處理器來提取的錯誤資訊的屬性。當建立一個能丟擲不同異常的模組時候,習慣做法就是建立一個為這個模組異常定義的基類。子類可以為不同的錯誤情況建立不同的具體異常。
class Error(Exception):
"""Base class for exceptions in this module.""" 在這個模組中的異常基類
pass
class InputError(Error):
"""Exception raised for errors in the input. 輸入時候丟擲異常
Attributes:
expression -- input expression in which the error occurred
message -- explanation of the error
"""
def __init__(self, expression, message):
self.expression = expression
self.message = message
class TransitionError(Error):
"""Raised when an operation attempts a state transition that’s not
Allowed. 當一個操作試圖訪問不允許訪問的狀態事務時丟擲異常
Attributes:
previous -- state at beginning of transition 在事務開始時的狀態
next -- attempted new state 操作新的狀態
message -- explanation of why the specific transition is not allowed 解釋具體事務異常不允許的原因
"""
def __init__(self, previous, next, message):
self.previous = previous
self.next = next
self.message = message
大多數異常定義以Error結尾,這和標準異常的命名有點相似。
許多標準模組定義了自己的異常,來顯示在它方法中可能發生的異常。更多的詳細資訊請參考類節。