Hey.
When writing a question on stackoverflow I noticed that one variant of my code causes my Python to get OOM killed by the kernel.
This is the code:
#!/usr/bin/python3
import timeit
import argparse
parser = argparse.ArgumentParser(allow_abbrev=False)
parser.add_argument("-n", "--iterations", type=int, default=1)
args = parser.parse_args()
class MyModuleError(Exception):
pass
def foo():
try:
f = 1/0
except (ValueError, ZeroDivisionError) as e:
raise MyModuleError from e
def wrapper1():
try:
foo()
except MyModuleError as e:
t = type(e.__cause__)
if t is ZeroDivisionError:
pass
elif t is OSError:
pass
else:
raise
def wrapper2():
try:
foo()
except MyModuleError as e:
if isinstance(e.__cause__, ZeroDivisionError):
pass
elif isinstance(e.__cause__, OSError):
pass
else:
raise
def wrapper3():
try:
foo()
except MyModuleError as e:
try:
raise e.__cause__
except ZeroDivisionError:
pass
except OSError:
pass
except:
raise e #which should be the "outer" exception
t = timeit.timeit(wrapper1, number=args.iterations)
print(f"wrapper1: {t}")
t = timeit.timeit(wrapper2, number=args.iterations)
print(f"wrapper2: {t}")
t = timeit.timeit(wrapper3, number=args.iterations)
print(f"wrapper3: {t}")
Using a sufficiently high -n
(on my 64GB system it’s 100000000
) the python process eats up “all” memory until it gets killed.
Is this a bug in CPython (running 3.11.4 from Debian sid) or is there a reason for it?
Thanks,
Chris.