Реализация исключений Python

У меня возникли проблемы с внедрением системы исключений в моей программе. Я нашел где-то следующий фрагмент кода, который я пытаюсь использовать для своей программы:

class InvalidProgramStateException(Exception):
    def __init__(self, expr, msg):
        self.expr = expr
        self.msg = msg

Я думаю, что msg должно быть строковым сообщением, которое будет показано, но как мне заполнить "expr", когда я хочу вызвать это исключение? Должен ли я написать это от руки?

raise InvalidProgramStateException(what_here?, "there was an error")

2 ответа

Решение

Ваши пользовательские исключения на самом деле не должны принимать параметры вообще. Если у вас нет конкретного сообщения об ошибке или состояния для инкапсуляции в Exception, это будет работать просто отлично:

class MyException(Exception):
    pass

Это позволит вашей программе отлавливать случаи этого исключения по типу:

try:
    raise MyException()
except MyException:
    print "Doing something with MyException"
except:
    print "Some other error occurred... handling it differently"

Если вы хотите, чтобы Исключение имело какое-либо значимое строковое представление или свойства, которые предоставили бы вашему приложению более подробную информацию о том, что пошло не так, то тогда вы передадите дополнительные аргументы в конструктор. Число, имя и тип этих аргументов не определены в Python... они могут быть любыми. Просто не забудьте предоставить заказ __str__ или же __unicode__ метод, чтобы вы могли обеспечить содержательное текстовое описание:

class MyException(Exception):

    def __init__(self, msg):
        self.msg = msg

    def __str__(self):
        return "MyException with %s" % self.msg

В случае примера, который вы цитируете, expr а также msg параметры специфичны для вымышленного случая примера. Придуманный сценарий их использования:

def do_something(expr):
    if 'foo' in expr:
        raise InvalidProgramStateException(expr, "We don't allow foos here")
    return 5

user_input = 'foo bar'
try:
    do_something(user_input)
except InvalidProgramStateException, e:
    print "%s (using expression %s)" % (e.msg, e.expr)

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

Проверьте этот сайт: Учебники по ошибкам Python

Другие вопросы по тегам