New submission from asleep-cult <asleep.c...@gmail.com>:
The code below produces an unexpected traceback format that makes the source of an error very hard to find, this more than likely happens in less specific situations but this is how I came across it. I'm also not sure if this is an issue with asyncio, logging or the traceback module. import asyncio class Bar: def __init__(self): self.y = None class Foo: def __init__(self): self._bar = Bar() self.y def __getattribute__(self, name): try: attr = super().__getattribute__(name) except AttributeError as e: try: attr = self.ooops_spelled_bar_wrong.__getattribute__(name) except AttributeError: raise e return attr async def foo(): Foo() loop = asyncio.get_event_loop() loop.create_task(foo()) loop.run_forever() Traceback: Exception in default exception handler Traceback (most recent call last): File "C:\Users\User\AppData\Local\Programs\Python\Python38\lib\asyncio\base_events.py", line 1733, in call_exception_handler self.default_exception_handler(context) File "C:\Users\User\AppData\Local\Programs\Python\Python38\lib\asyncio\base_events.py", line 1707, in default_exception_handler logger.error('\n'.join(log_lines), exc_info=exc_info) File "C:\Users\User\AppData\Local\Programs\Python\Python38\lib\logging\__init__.py", line 1471, in error self._log(ERROR, msg, args, **kwargs) File "C:\Users\User\AppData\Local\Programs\Python\Python38\lib\logging\__init__.py", line 1585, in _log self.handle(record) File "C:\Users\User\AppData\Local\Programs\Python\Python38\lib\logging\__init__.py", line 1595, in handle self.callHandlers(record) File "C:\Users\User\AppData\Local\Programs\Python\Python38\lib\logging\__init__.py", line 1665, in callHandlers lastResort.handle(record) File "C:\Users\User\AppData\Local\Programs\Python\Python38\lib\logging\__init__.py", line 950, in handle self.emit(record) File "C:\Users\User\AppData\Local\Programs\Python\Python38\lib\logging\__init__.py", line 1081, in emit msg = self.format(record) File "C:\Users\User\AppData\Local\Programs\Python\Python38\lib\logging\__init__.py", line 925, in format return fmt.format(record) File "C:\Users\User\AppData\Local\Programs\Python\Python38\lib\logging\__init__.py", line 672, in format record.exc_text = self.formatException(record.exc_info) File "C:\Users\User\AppData\Local\Programs\Python\Python38\lib\logging\__init__.py", line 622, in formatException traceback.print_exception(ei[0], ei[1], tb, None, sio) File "C:\Users\User\AppData\Local\Programs\Python\Python38\lib\traceback.py", line 103, in print_exception for line in TracebackException( File "C:\Users\User\AppData\Local\Programs\Python\Python38\lib\traceback.py", line 493, in __init__ context = TracebackException( File "C:\Users\User\AppData\Local\Programs\Python\Python38\lib\traceback.py", line 493, in __init__ context = TracebackException( File "C:\Users\User\AppData\Local\Programs\Python\Python38\lib\traceback.py", line 493, in __init__ context = TracebackException( [Previous line repeated 488 more times] File "C:\Users\User\AppData\Local\Programs\Python\Python38\lib\traceback.py", line 476, in __init__ _seen.add(id(exc_value)) RecursionError: maximum recursion depth exceeded while calling a Python object ``` The code below procures the expected traceback import traceback class Bar: def __init__(self): self.y = None class Foo: def __init__(self): self._bar = Bar() self.y def __getattribute__(self, name): try: attr = super().__getattribute__(name) except AttributeError as e: try: attr = self.ooops_spelled_bar_wrong.__getattribute__(name) except AttributeError: raise e return attr try: Foo() except: traceback.print_exc() Traceback: During handling of the above exception, another exception occurred: Traceback (most recent call last): File "c:/Development/test/test.py", line 15, in __getattribute__ attr = super().__getattribute__(name) AttributeError: 'Foo' object has no attribute 'ooops_spelled_bar_wrong' # The part above is repeated hundreds of times Traceback (most recent call last): File "c:/Development/test/test.py", line 24, in <module> Foo() File "c:/Development/test/test.py", line 11, in __init__ self.y File "c:/Development/test/test.py", line 18, in __getattribute__ attr = self.ooops_spelled_bar_wrong.__getattribute__(name) File "c:/Development/test/test.py", line 18, in __getattribute__ attr = self.ooops_spelled_bar_wrong.__getattribute__(name) File "c:/Development/test/test.py", line 18, in __getattribute__ attr = self.ooops_spelled_bar_wrong.__getattribute__(name) [Previous line repeated 992 more times] File "c:/Development/test/test.py", line 15, in __getattribute__ attr = super().__getattribute__(name) RecursionError: maximum recursion depth exceeded while calling a Python object During handling of the above exception, another exception occurred: Traceback (most recent call last): File "c:/Development/test/test.py", line 26, in <module> traceback.print_exc() File "C:\Users\User\AppData\Local\Programs\Python\Python38\lib\traceback.py", line 163, in print_exc print_exception(*sys.exc_info(), limit=limit, file=file, chain=chain) File "C:\Users\User\AppData\Local\Programs\Python\Python38\lib\traceback.py", line 103, in print_exception for line in TracebackException( File "C:\Users\User\AppData\Local\Programs\Python\Python38\lib\traceback.py", line 493, in __init__ context = TracebackException( File "C:\Users\User\AppData\Local\Programs\Python\Python38\lib\traceback.py", line 493, in __init__ context = TracebackException( File "C:\Users\User\AppData\Local\Programs\Python\Python38\lib\traceback.py", line 493, in __init__ context = TracebackException( [Previous line repeated 495 more times] RecursionError: maximum recursion depth exceeded ---------- components: Library (Lib) messages: 384551 nosy: asleep-cult priority: normal severity: normal status: open title: asyncio produces an unexpected traceback with recursive __getattribute__ type: behavior versions: Python 3.8 _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue42848> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com