1. 程式人生 > >Python3.2官方文件翻譯--異常丟擲和自定義異常

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(

HiThere)

... 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 thats 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結尾,這和標準異常的命名有點相似。

許多標準模組定義了自己的異常,來顯示在它方法中可能發生的異常。更多的詳細資訊請參考類節。