<p>我会这样做:</p>
<pre><code>class MyCustomException(Exception): # note naming convention
MESSAGES = {
0x00000000: 'NO ERROR',
0x00000001: 'Error 1 occurred',
0x00000002: 'Error 2 occurred',
0x00000004: 'Error 3 occurred',
...
}
def __init__(self, err_num, *args, **kwargs):
super(MyCustomException, self).__init__(*args, **kwargs) # handle inheritance
self.err_num = int(err_num)
self.err_msg = self._create_err_msg(self.err_num)
def __str__(self):
return "ERROR (0x%08X): %s" % (self.err_num, self.err_msg)
def __repr__(self):
# Note that __repr__ should be eval-able
return 'MyCustomException(%d)' % self.err_num
@classmethod
def _create_err_msg(cls, err_num):
messages = []
for num, msg in cls.MESSAGES.items():
if err_num & num:
messages.append(msg)
return ' and '.join(messages) if messages else cls.MESSAGES[0]
</code></pre>
<p>注意,通过将错误消息提取到dictionary类属性中,这简化了代码;将其作为一个单独的方法也可以更容易地进行单独测试:</p>
<pre><code>>>> MyCustomException._create_err_msg(5)
'Error 1 occurred and Error 3 occurred'
>>> MyCustomException._create_err_msg(2)
'Error 2 occurred'
>>> MyCustomException._create_err_msg(0)
'NO ERROR'
</code></pre>
<p>使用中:</p>
<pre><code>>>> exc = MyCustomException(5)
>>> str(exc)
'ERROR (0x00000005): Error 1 occurred and Error 3 occurred'
</code></pre>