Я получаю предупреждение о том, что BaseException.message устарело в Python 2.6, когда я использую следующее пользовательское исключение:
class MyException(Exception):
def __init__(self, message):
self.message = message
def __str__(self):
return repr(self.message)
Это предупреждение:
DeprecationWarning: BaseException.message has been deprecated as of Python 2.6
self.message = message
Что с этим не так? Что я должен изменить, чтобы избавиться от предупреждения об устаревании?
python
exception
deprecated
desolat
источник
источник
Ответы:
Решение - почти не требуется кодирование
Просто наследуйте ваш класс исключений от
Exception
и передайте сообщение в качестве первого параметра конструкторуПример:
Вы можете использовать
str(my)
или (менее элегантно)my.args[0]
для доступа к пользовательскому сообщению.Задний план
В более новых версиях Python (начиная с 2.6) мы должны наследовать наши пользовательские классы исключений от Exception, которое ( начиная с Python 2.5 ) наследует от BaseException. Фон подробно описан в PEP 352 .
__str__
и__repr__
уже реализованы осмысленным образом, особенно в случае только одного аргумента (который может использоваться в качестве сообщения).Вам не нужно повторять
__str__
или__init__
реализацию или создание_get_message
в соответствии с предложением других.источник
str
разрывов, если исключение было создано с аргументом Юникод:str(MyException(u'\xe5'))
поднимаетсяUnicodeEncodeError
. Использованиеunicode
вместоstr
не являетсяunicode(MyException('\xe5'))
надежным, потому что вызывает UnicodeDecodeError. Означает ли это, что если я не знаю заранее, является ли аргументstr
илиunicode
, я должен использовать,.args[0]
где я ранее использовал.message
?.message
в нашем проекте.args[0]
, и это не вызвало у нас никаких проблем.Да, это устарело в Python 2.6, потому что оно исчезает в Python 3.0
Класс BaseException больше не позволяет хранить сообщения об ошибках. Вам придется реализовать это самостоятельно. Вы можете сделать это с помощью подкласса, который использует свойство для хранения сообщения.
Надеюсь это поможет
источник
@property
синтаксиса, когда вам действительно нужна инкапсуляция.@property
чтобы отключить предупреждение об устаревании.Это ваш класс в стиле Python2.6. Новое исключение принимает произвольное количество аргументов.
источник
Как повторить предупреждение
Позвольте мне прояснить проблему, так как никто не может повторить это с примером кода вопроса, это будет повторять предупреждение в Python 2.6 и 2.7, если у вас включены предупреждения (через
-W
флаг ,PYTHONWARNINGS
переменную среды или модуль предупреждений ):Прекратить использование
.message
Я предпочитаю
repr(error)
, которая возвращает строку, содержащую имя типа ошибки, repr сообщения, если оно есть, и repr оставшихся аргументов.Устранение предупреждения при использовании
.message
И способ, которым вы избавляетесь от этого,
DeprecationWarning
состоит в том, чтобы создать подкласс встроенного исключения, как задумывалось дизайнерами Python:получить только
.message
атрибут безerror.message
Если вы знаете, что для Исключения был один аргумент, сообщение, и это то, что вам нужно, предпочтительно избегать атрибута сообщения и просто принимать сообщение
str
об ошибке. Скажи для подклассаException
:И использование:
Смотрите также этот ответ:
Правильный способ объявить пользовательские исключения в современном Python?
источник
Насколько я могу судить, простое использование другого имени для атрибута сообщения позволяет избежать конфликта с базовым классом и, таким образом, останавливает предупреждение об устаревании:
Похоже, взломать для меня.
Может быть, кто-то может объяснить, почему выдается предупреждение, даже если подкласс явно определяет атрибут сообщения. Если базовый класс больше не имеет этого атрибута, проблем не должно быть.
источник
Продолжая от ответа geekQ , предпочтительная замена кода зависит от того, что вам нужно сделать:
Иногда исключения имеют более одного аргумента, поэтому
my.args[0]
не гарантируется предоставление всей необходимой информации.Например:
Печать как вывод:
Однако это контекстно-зависимый компромисс, потому что, например:
источник
str(my)
вместоmy.message
.Совет использовать str (myexception) приводит к проблемам с юникодом в python 2.7, например:
:(
работает должным образом и является предпочтительным в тех случаях, когда часть содержимого строки ошибки включает в себя пользовательский ввод
источник
пост pzrq говорит, что использовать:
Это было именно то, что мне было нужно.
(Если вы находитесь в среде Unicode, кажется, что:
будет работать, и, кажется, работает нормально в среде не-Unicode)
Пзрк сказал много других хороших вещей, но я почти пропустил их ответ из-за всех хороших вещей. Поскольку у меня нет 50 баллов, я не могу прокомментировать их ответ, чтобы попытаться привлечь внимание к простому работающему решению, и, поскольку у меня нет 15 баллов, я не могу проголосовать за этот ответ, но я могу опубликовать (чувствует себя отсталым, но да ладно) - так вот я и выкладываю - наверно теряю очки за это ...
Так как моя цель - привлечь внимание к ответу pzrq, пожалуйста, не застекляйте и не пропустите его во всем нижеприведенном. первые несколько строк этого поста являются наиболее важными.
Моя история:
Проблема, ради которой я пришел сюда, заключалась в том, что если вы хотите поймать исключение из класса, который вы не можете контролировать - что тогда ??? Я, конечно, не собираюсь создавать подклассы для всех возможных классов, которые использует мой код, чтобы попытаться получить сообщение из всех возможных исключений!
Я использовал:
который, как мы все теперь знаем, дает предупреждение, о котором спрашивал OP (что привело меня сюда), и это, которое pzrq дает как способ сделать это:
не.
Я не нахожусь в среде Юникода, но ответ JJC заставил меня задуматься, поэтому я должен был попробовать. В этом контексте это становится:
который, к моему удивлению, работал точно так же, как str (e) - так что теперь это то, что я использую.
Не знаю, является ли 'str (e) / unicode (e)' 'одобренным способом Python', и я, вероятно, выясню, почему это не очень хорошо, когда я доберусь до 3.0, но можно надеяться, что способность обрабатывать Неожиданное исключение (*) без смерти и получения информации от него никогда не исчезнет ...
(*) Хм. «неожиданное исключение» - думаю, я просто заикался!
источник