实现python异常

dev*_*ium 3 python exception

我在程序中实现异常系统时遇到一些问题.我找到了以下代码,我试图用于我的程序:

class InvalidProgramStateException(Exception):
    def __init__(self, expr, msg):
        self.expr = expr
        self.msg = msg
Run Code Online (Sandbox Code Playgroud)

我认为msg必须是要显示的字符串消息,但是当我想要引发此异常时如何填写"expr"?我必须手工编写吗?

raise InvalidProgramStateException(what_here?, "there was an error")
Run Code Online (Sandbox Code Playgroud)

Jar*_*die 11

您的自定义异常实际上根本不需要参数.如果您没有任何特定的错误消息或状态要封装在Exception中,这将正常工作:

class MyException(Exception):
    pass
Run Code Online (Sandbox Code Playgroud)

这将允许您的程序通过以下类型捕获此异常的情况:

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

如果您希望Exception具有一些有意义的字符串表示形式,或者具有可以为您的应用程序提供有关错误的更多详细信息的属性,那么当您将其他参数传递给构造函数时.这些参数的数量,名称和类型并不是由Python预先定义的......它们可以是任何东西.请务必提供自定义__str____unicode__方法,以便提供有意义的文本描述:

class MyException(Exception):

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

    def __str__(self):
        return "MyException with %s" % self.msg
Run Code Online (Sandbox Code Playgroud)

在您引用的示例的情况下,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)
Run Code Online (Sandbox Code Playgroud)

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

  • 您不需要提供新的构造函数或`__str __()`.默认情况下,参数将放在self.args中,它们将由`__str __()`打印. (3认同)