Skip to content

Python implicit boolean conversion in logical operations bypasses try/except on 3.14.0rc1 #137288

@justinjfu

Description

@justinjfu

Bug report

Bug description:

Throwing an exception during an implicit cast to a boolean as part of a logical operation (or, and) bypasses surrounding try/except statements.

The following example works on Python 3.12.3 but fails on Python 3.14.0rc1:

Example:

class Foo:
  def __bool__(self):
    raise NotImplementedError()

a = Foo()
b = Foo()

# Works
try:
  c = bool(a)
except:
  print("passed c = bool(a)")

# Fails
try:
  c = a or b
except:
  print("passed c = a or b")

Output on Python 3.12.3 (expected behavior):

passed c = bool(a)
passed c = a or b

Output on Python 3.14.0rc1:

passed c = bool(a)
Traceback (most recent call last):
  File "/Users/justinfu/code/test_bool.py", line 15, in <module>
    c = a or b
        ^^^^^^
  File "/Users/justinfu/code/test_bool.py", line 3, in __bool__
    raise NotImplementedError()
NotImplementedError

CPython versions tested on:

3.14

Operating systems tested on:

macOS

Linked PRs

Metadata

Metadata

Assignees

Labels

3.14bugs and security fixes3.15new features, bugs and security fixesinterpreter-core(Objects, Python, Grammar, and Parser dirs)release-blockertype-bugAn unexpected behavior, bug, or error

Projects

Status

Todo

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions