【问题标题】:Try/Except not catching a "greater than" error尝试/除了没有捕获“大于”错误
【发布时间】:2014-10-05 16:11:39
【问题描述】:

以下代码不起作用:

try:
    get_current_player(request).cash >= bid # does the player have enough cash for this bid ?
except ValueError:
    messages.error(request, "You don't have the necessary funds to place a bid of <span class='cash'>%d</span> !" % (bid))
messages.success(request, "You placed a bid of %d !" % (bid))

当出价高于当前玩家的现金时,将打印成功消息而不是错误消息。

但是,以下代码有效,表明值是正确的:

if get_current_player(request).cash >= bid : # does the player have enough cash for this bid ?
    messages.success(request, "You placed a bid of %d !" % (bid))
else :
    messages.error(request, "You don't have the necessary funds to place a bid of <span class='cash'>%d</span> !" % (bid))

我是否使用了 try/except 错误?

【问题讨论】:

    标签: python django try-except


    【解决方案1】:

    是的,您使用 try/except 错误。比较不会引发任何异常,因为如果结果为 False,则不会出现异常。您的第二个代码是处理此类问题的正确方法。

    【讨论】:

      【解决方案2】:

      为什么会这样

      get_current_player(request).cash >= bid
      

      应该返回错误吗?这是错的吗?不,这就是为什么你没有 ValueError 。

      【讨论】:

        【解决方案3】:

        如果您希望比较 get_current_player(request).cash &gt;= bid 始终有效且不会产生错误,则不应使用 try/except。在第二个代码块中使用if/else

        使用您的第一个代码块,get_current_player(request).cash &gt;= bid 被尝试并评估为True/False。只要这个比较没有产生ValueError(并且没有明显的理由为什么会产生),except 块就不会执行。

        except 块不会仅仅因为比较评估为False 而运行。

        编辑:如果您认为评估get_current_player(request).cash &gt;= bid 可能会引发异常,您可以将if/else 块放入try 块中:

        try:
            if get_current_player(request).cash >= bid:
                messages.success(request, "You placed a bid of %d !" % (bid))
            else:
                messages.error(request, "You don't have the necessary funds to place a bid of <span class='cash'>%d</span> !" % (bid))
        
        except ValueError:
            # handle the ValueError
        

        您可能希望允许比较也可能触发的任何其他错误(例如AttributeError)。

        【讨论】:

        • 我明白了,谢谢。通常,现金应该足够了。没有这种情况是很少见的。因此,在我看来,try/except 是最好的方法,因为当我只想检查玩家是否有足够的现金时,它可以避免嵌套。有没有办法为此目的使用 try/except,或者这样做不是好习惯?
        • @Brachamul 您当然可以同时使用两者 - 我已经相应地编辑了我的答案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-15
        • 2017-11-24
        • 2016-07-12
        • 1970-01-01
        • 2016-03-15
        • 1970-01-01
        相关资源
        最近更新 更多