通過創(chuàng)建一個(gè)新的異常類卸奉,程序可以命名他們自己的異常睬塌。異常應(yīng)該是典型的繼承自Exception類,通過直接或間接的方式昆庇。
一下為與RuntimeErrot相關(guān)的實(shí)例赤惊,實(shí)例中創(chuàng)建了一個(gè)類,基類為RuntimeError.用于在異常出發(fā)時(shí)輸出更多的信息凰锡。
在try語句塊中未舟,用戶自定義的異常后執(zhí)行except塊語句,變量 e 是用于創(chuàng)建Networkerror類的實(shí)例掂为。
class Networkerror(RuntimeError):
def __init__(self, arg):
self.args = arg
在你定義以上類后裕膀,你可以觸發(fā)該異常,如下所示:
try:
raise Networkerror("Bad hostname")
except Networkerror,e:
print e.args
在下面這個(gè)例子中勇哗,默認(rèn)的init()異常已被我們重寫昼扛。
>>> 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!'
常見的做法是創(chuàng)建一個(gè)由該模塊定義的異常基類和子類欲诺,創(chuàng)建特定的異常類不同的錯(cuò)誤條件抄谐。
我們通常定義的異常類,會(huì)讓它比較簡(jiǎn)單扰法,允許提取異常處理程序的錯(cuò)誤信息蛹含,當(dāng)創(chuàng)建一個(gè)異常模塊的時(shí)候,常見的做法是創(chuàng)建一個(gè)由該模塊定義的異橙洌基類和子類浦箱,根據(jù)不同的錯(cuò)誤條件吸耿,創(chuàng)建特定的異常類:
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