【问题标题】:Implementing python exceptions实现python异常
【发布时间】:2010-12-25 01:30:06
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: python exception


    【解决方案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)
    

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

    【讨论】:

    • 您不需要提供新的构造函数或__str__()。默认情况下,参数将放在 self.args 中,它们将由__str__() 打印。
    • 感谢 Bastien... 一个不错的补充。我已经习惯于对异常及其在日志中的表现形式感到迂腐——我很感激你把我带回了现实。
    • 你甚至不需要实例化:raise MyException
    • 足够公平的 THC4k :-) 你当然是对的。不过,出于某种原因,这让我感到很沮丧。我可能只是闪回 Guido 在 Python 1.5 中建议显式调用异常构造函数,但隐式实例化让我感觉不完整。不过,我没有客观的理由,所以我很高兴你提出来。
    • @Jarret,我对此也有同感,而且知道事实上 Python 无论如何都会实例化它总是让我自己做这项工作,明确地说。
    【解决方案2】:

    查看本站:Error tutorials Python

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多