实现Python异常

3 投票
1 回答
4577 浏览
提问于 2025-04-15 16:51

我在我的程序中实现异常系统时遇到了一些问题。
我在某个地方找到了以下这段代码,想用在我的程序里:

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

我觉得msg应该是要显示的字符串消息,但当我想要抛出这个异常时,"expr"该怎么填呢?我需要手动写吗?

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

1 个回答

12

你自定义的异常其实根本不需要带参数。如果你没有特别的错误信息或者状态需要在异常中包含,这样写就可以了:

class MyException(Exception):
    pass

这样的话,你的程序就可以通过类型来捕捉这种异常:

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

如果你希望这个异常有一些有意义的字符串表示,或者有一些属性可以提供更多关于出错信息的细节,那时候你可以给构造函数传递额外的参数。这些参数的数量、名称和类型其实并没有固定的规定... 它们可以是任何东西。只要确保提供一个自定义的 __str____unicode__ 方法,这样你就可以提供一个有意义的文本描述:

class MyException(Exception):

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

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

在你引用的例子中,exprmsg 参数是特定于这个虚构案例的。一个假设的场景是它们可能会这样使用:

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)

既然看起来你的应用不需要这些参数,那就直接去掉不需要的参数吧。

撰写回答