为什么`if Exception`在Python中工作

时间:2014-12-28 22:17:19

标签: python exception exception-handling boolean

在这个答案https://stackoverflow.com/a/27680814/3456281中,提出了以下结构

a=[1,2]
while True:
    if IndexError:
        print ("Stopped.")
        break
    print(a[2])

实际打印"停止。"和中断(用Python 3.4.1测试)。

为什么?为什么if IndexError合法?为什么a[2]不会引发IndexError而没有try ... except

2 个答案:

答案 0 :(得分:28)

所有对象都有一个布尔值。如果没有另外定义,则该布尔值为True。

所以这段代码就等同于做if True;所以执行立即到达break语句,永远不会到达print

答案 1 :(得分:3)

查看Python documentation,Python标准库的内置类型下的真值测试部分。第一个句子和最后一个项目符号后的第一个句子回答了你的问题。

  

任何对象都可以测试真值......

  

所有其他值都被认为是真的 - 所以很多类型的对象都是   总是如此。

以下是文档的全文(括号中的内容,[],作为扩充添加):

  

5.1。真值测试

     

可以测试任何对象的真值,以便在if或while中使用   条件或下面的布尔运算的操作数。下列   值被视为错误:

     
      
  • None

  •   
  • False

  •   
  • 任何数字类型的零,例如00L0.00j

  •   
  • 任何空序列,例如''()[]

  •   
  • 任何空映射,例如{}

  •   
  • 用户定义类的实例,如果类在Python 2中定义__bool__() [__nonzero__()]或__len__()方法,则该方法返回整数零或bool价值False。 [参见Python语言参考的数据模型,特殊方法名称,第Basic Customization部分]

  •   
     

所有其他值都被认为是真的 - 所以很多类型的对象都是   总是如此。

     

始终具有布尔结果的操作和内置函数   返回0False表示false,1True表示true,除非另有说明   说明。 (重要的例外:布尔操作orand始终   返回他们的一个操作数。)

<强>结论

因为Exception没有__bool____nonzero____len__,(也不属于上面列出的其他条件)Exception个对象将始终在布尔上下文中作为True进行测试。