2009-12-09 163 views
3

我在执行程序中的异常系统时遇到了一些问题。 我在什么地方找到了下面的一段代码,我试图用我的程序:实现python异常

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

我认为味精必须是一个字符串消息显示,但如何填补“expr的”当我想提出这个例外?我是否必须亲手写作?

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

回答

10

您的自定义异常实际上并不需要带参数的。如果你没有得到任何特定的错误信息或状态异常封装,这会工作得很好:

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 

在你引述的例子的情况下,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) 

因为它不出现,你的应用程序需要它,就放弃你并不需要的参数。

+3

您不需要提供新的构造函数或'__str __()'。默认参数将被放置在self.args中,并且它们将被'__str __()'打印。 – 2009-12-09 23:45:07

+0

感谢Bastien ......一个很好的补充。我太习惯于对例外以及它们在原木中的表现进行迂腐 - 我很感激你让我回到地球。 – 2009-12-09 23:49:17

+1

你甚至不需要实例化:'raise MyException' – 2009-12-10 00:02:26