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

Jas*_*per 12 python boolean exception-handling exception

在这个答案/sf/answers/1937657011/中,提供了以下构造

a=[1,2]
while True:
    if IndexError:
        print ("Stopped.")
        break
    print(a[2])
Run Code Online (Sandbox Code Playgroud)

实际上打印"已停止".和破坏(用Python 3.4.1测试).

为什么?!为什么if IndexError甚至合法?为什么a[2]不会引发IndexError不带try ... except身边?

Dan*_*man 28

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

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

  • @Jasper:https://docs.python.org/2/reference/datamodel.html#object.__nonzero__说"如果一个类既没有定义`__len __()`也没有`__nonzero __()`,那么它的所有实例都被认为是真的. " (15认同)
  • @Jasper:和[*真值测试*](https://docs.python.org/2/library/stdtypes.html#truth-value-testing):*任何对象都可以测试真值,以便使用在`if`或`while`条件下或作为下面布尔运算的操作数.以下值被视为false:[...]所有其他值都被视为true - 因此许多类型的对象始终为true.*异常只是更多对象. (2认同)