Это подходящий способ определить и использовать исключение Python? - PullRequest
3 голосов
/ 29 августа 2011

Я просто хочу убедиться, что я делаю это надлежащим "питоническим" способом - я хочу убедиться, что я определил - и использую - этот класс исключений правильно.Особенно логика eval (repr ()) - в основном для чистоты, я понимаю, почему вы заканчиваете кавычками вокруг строки, возвращаемой repr (), но я не люблю их регистрировать.

class IPCClientError(Exception):
    """ General IPC Client Exception class """
    def __init__(self, value = "Unspecified error"):
        self.val = value + ", see IPC client log for details."

    def __str__(self):
        return eval(repr(self.val))

Когда я поднимаю исключение, я использую что-то вроде:

raise IPCClientError("Socket error")

И тогда вызывающий метод будет выглядеть примерно так:

except IPCClientError, exc:
    self.log.error(str(exc))
    return ERROR

Ответы [ 2 ]

4 голосов
/ 29 августа 2011
eval(repr(self.val))

Eek, что вы пытаетесь достичь здесь? Разве self.val уже не должен быть строкой?

Чтобы избежать кавычек, которые repr вставляет, не стоит использовать его в первую очередь.

Если вы беспокоитесь о том, что значение, переданное конструктору, не будет строкой, что ж, в любом случае это не получится в конструкторе (несмотря на unicode придирки), и вы просто повысите TypeError до Ваше пользовательское исключение может быть.

Что касается того, как вы обрабатываете исключение, обработка исключения является своего рода искусством, и на самом деле это не то, что можно охватить в этом пространстве ...

2 голосов
/ 29 августа 2011

(кроме того, что eval уже упоминалось другими)

В вашем выражении except вы должны написать except IPCClientError as exc: (обратите внимание на "как"), что является более новым, Python 3совместимый способ сделать это.(другой синтаксис больше не будет работать в Python 3, новый работает в Python 2.6 и выше)

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