【问题标题】:Try/Except error when using 'None'使用“无”时尝试/排除错误
【发布时间】:2014-08-28 23:42:25
【问题描述】:

我有一些不符合预期的代码。 我把它浓缩成这里的问题:

item = None

try:
    if item != None:
        print('pass')
except TypeError, e:
    print('fail')

如果项目不是“无”类型,则打印通过。我想提出一个例外 如果项目是无,但当我将项目设置为无时,什么都不会打印出来。

我可以使用 if 语句轻松地做到这一点,但我很想知道为什么这不能作为 try/except 工作。

有什么想法吗?

谢谢!

【问题讨论】:

  • 您想raise 出错吗?
  • item != None 应该是 item is not None。阅读Pep8。来自 Pep8:应始终使用 isis not 与像 None 这样的单例进行比较,而不是使用相等运算符。

标签: python try-catch except


【解决方案1】:

如果你真的想在itemNone 时引发异常,最简单的方法是

if item is None:
    raise TypeError("'None' value provided for item of farkling routine")

正如已经指出的那样,在您的示例中,您没有导致 except 子句触发的任何异常。但我可能误解了你的问题。

【讨论】:

    【解决方案2】:

    您的原始代码:

    item = None
    
    try:
        if item != None:
            print('pass')
    except TypeError, e:
        print('fail')
    

    print('fail') 中的 print('fail') 不起作用的原因是 try except 块实际上没有引发任何错误。想想看,变量item 是在上面声明的,所以它确实存在。然后您正在测试以查看if item != None,在这种情况下它是无,但这不会引发异常。

    让我们删除item = None,就像这样。

    try:
        if item != None:
            print('pass')
    except TypeError, e:
        print('fail')
    

    你会发现你的 try except 块现在会引发一个异常,调用你的print('fail')。这是因为,现在您正在尝试测试if item != None,但没有item 这样的变量,因此异常调用。

    检查变量是否为None 的简单方法是执行以下操作。

    is_none = True if item is None else False
    print(is_none)
    

    相当于

    if item is None:
        is_none = True
    else:
        is_none = False
    
    print(is_none)
    

    【讨论】:

    • 您的is_none = True if item is None else False 示例有点非Pythonic,当is_none = item is None 实现相同的结果时。
    • @holdenweb 你是对的。我不知道我为什么这样做,因为我在自己的代码中没有这样做,可能是为了更具可读性并展示内联 if 语句的使用以供将来使用。
    • 大脑有时会放屁 :)
    【解决方案3】:

    更多pythonic方式:

    item = None
    result = 'pass' if item is not None else 'fail'
    print result
    

    【讨论】:

      【解决方案4】:

      没有什么可以在你的try 块中提出TypeError,它只是检查是否item !=Noneitem !=None 将是 TrueFalse,但在任何一种情况下都不会引发错误。

      您可以执行以下操作:

      item = None
      try:
          if item != None: # better: if item is not None
              print('pass')
          else:        
              raise TypeError 
      except TypeError:
          print('fail')
      

      或者简单地说:

      item = None
      if item != None: # better: if item is not None
          print('pass')
      else:
          print('fail')        
      

      【讨论】:

      • 在测试None 时,始终使用is Noneis not None。毕竟None 是一个单身人士。
      • 感谢 Martjin,我试图尽可能接近 OP 的代码,但会留下评论以提示更好的编写方式。
      • 谢谢!是的,我不记得是否最好将“is/is not”与 None 一起使用。
      猜你喜欢
      • 1970-01-01
      • 2019-02-04
      • 1970-01-01
      • 2016-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-28
      • 1970-01-01
      相关资源
      最近更新 更多