Реализация исключений 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)
Поскольку кажется, что ваше приложение этого не требует, просто отбросьте параметры, которые вам не нужны.