小编典典

实现python异常

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")

阅读 237

收藏
2020-12-20

共1个答案

小编典典

您的自定义例外实际上根本不需要采用参数。如果您没有要封装在Exception中的任何特定错误消息或状态,则可以正常工作:

class MyException(Exception):
    pass

这将允许您的程序按类型捕获此异常的情况:

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

如果您希望Exception具有一些有意义的字符串表示形式,或者具有可以为您的应用程序提供更多有关发生问题的详细信息的属性,则当您将其他参数传递给构造函数时。这些参数的数量,名称和类型并不是由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)

由于似乎您的应用程序不需要它,因此只需删除不需要的参数即可。

2020-12-20