Поле «Значение исключения» пусто при создании пользовательских исключений в Django - PullRequest
1 голос
/ 20 июля 2010

У меня есть пользовательские исключения в моем проекте django, которые выглядят так:

class CustomFooError(Exception):

    def __init__(self, msg="Something went wrong with Foo."):
        self.msg = msg

    def __str__(self):
        return repr(self.msg) 

В различных точках моего кода я буду вызывать исключения вроде этого:

raise CustomFooError("Things are going badly")

Когда Django ловитэти ошибки, в режиме отладки я получаю стандартную красивую страницу трассировки стека в django.Но я никогда не вижу своих сообщений об ошибках - «Все идет плохо» никогда не появляется на странице ошибок отладки.

Кажется, они должны отображаться как Exception Value на странице ошибок.Я прошёл через источник django достаточно далеко, чтобы выяснить, что это поле value из sys.exc_info(), которое последовательно кратко задокументировано как «[исключение] связанное значение или второй аргумент для поднятия, который всегда является экземпляром классаесли тип исключения является объектом класса. "К сожалению, я не знаю, что делать с этой информацией.

Так что мой вопрос: как мне писать и поднимать свои пользовательские исключения, чтобы получить больше полезных данных, которые будут отображаться в таких местах, как экран ошибок django

Ответы [ 2 ]

3 голосов
/ 20 июля 2010

Я бы просто использовал super и позволил бы конструктору Exception обработать присвоение атрибута msg:

class CustomFooError(Exception):

    def __init__(self, msg=None):
        if msg is None:
            msg = 'Something went wrong with Foo.'
        super(CustomFooError, self).__init__(msg)

Я только что проверил это из среды Django, и оно правильно отображало сообщение, которое я передал конструктору исключений, или сообщение по умолчанию, если None было передано.

1 голос
/ 20 июля 2010

@ AdmiralNemo прав: пусть базовый класс сделает всю работу.

Но если углубиться в ваш код, проблема в том, что вы вообще не привязаны к реализации Exception. Исключение (я) хранит s в атрибуте .message, а не .msg. Он также сохраняет его как (s,) в атрибуте .args. Ваш код не устанавливает ни один из этих атрибутов, поэтому, вероятно, Django не может найти сообщение для отображения.

Кроме того, ваш __str__ метод нечетный. Он должен возвращать self.msg, а не repr(self.msg), что добавит кавычки вокруг строки и может быть скрыто внутри текста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...