Каков правильный способ объявления пользовательских классов исключений в современном Python? Моя основная цель - следить за любыми стандартными другими классами исключений, так что (например) любая дополнительная строка, которую я включаю в исключение, печатается любым инструментом, пойманным за исключением.
Под "современным Python" я подразумеваю что-то, что будет работать в Python 2.5, но будет "правильным" для способов Python 2.6 и Python 3. *. И под "custom" я подразумеваю объект Exception, который может включать дополнительные данные о причине ошибки: строка, возможно, также некоторые другие произвольные объекты, относящиеся к исключению.
В Python 2.6.2 я был отключен следующим предупреждением об отказе:
>>> class MyError(Exception):
... def __init__(self, message):
... self.message = message
...
>>> MyError("foo")
_sandbox.py:3: DeprecationWarning: BaseException.message has been deprecated as of Python 2.6
Кажется сумасшедшим, что BaseException
имеет особое значение для атрибутов с именем message
. Я собираюсь из PEP-352, что атрибут имел особое значение в 2,5 раза "Я пытаюсь отказаться от этого, поэтому я предполагаю, что имя (и только одно) теперь запрещено? Тьфу.
Я также смутно понимаю, что Exception
имеет некоторый магический параметр args
, но я никогда не знал, как его использовать. И я не уверен, что это правильный способ сделать то, что нужно сделать; многие обсуждения, которые я нашел в Интернете, предположили, что они пытались покончить с args в Python 3.
Обновление: два ответа предложили переопределить __init__
и __str__
/__unicode__
/__repr__
. Это похоже на много типизирования, нужно ли это?