Skip to content

Issues when showing broken Exception.__notes__ #103895

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Closed
pR0Ps opened this issue Apr 26, 2023 · 5 comments
Closed

Issues when showing broken Exception.__notes__ #103895

pR0Ps opened this issue Apr 26, 2023 · 5 comments
Assignees
Labels
interpreter-core (Objects, Python, Grammar, and Parser dirs) type-bug An unexpected behavior, bug, or error

Comments

@pR0Ps
Copy link
Contributor

pR0Ps commented Apr 26, 2023

Bug report

When notes on an exception cannot be shown because the repr and str raise exceptions, a <note str() failed> message is shown instead. In the case where exception.__notes__ is not a sequence and cannot be shown, a <__notes__ repr() failed> is shown. In the second case, the message does not include a trailing newline.

__notes__ is a list containing a broken "note" - output includes a newline:

class A:
    def __repr__(self):
        raise Exception()

e = Exception()
e.__notes__ = [A()]  # !!!
raise e
user@host $ ./repro.py
Traceback (most recent call last):
  File "./repro.py", line 8, in <module>
    raise e
Exception
<note str() failed>
user@host $ 

__notes__ is just a single broken "note" - output does not include a newline:

class A:
    def __repr__(self):
        raise Exception()

e = Exception()
e.__notes__ = A()  # !!!
raise e
user@host $ ./repro.py
Traceback (most recent call last):
  File "./repro.py", line 8, in <module>
    raise e
Exception
<__notes__ repr() failed>user@host $ 

Additionally, when __notes__ is a string/bytes, the contents are expoded over multiple lines because of an isinstance(__notes__, Sequence) check.

String:

e = Exception()
e.__notes__ = "a note"
raise e
user@host $ ./repro.py
Traceback (most recent call last):
  File "./repro.py", line 8, in <module>
    raise e
Exception
a

n
o
t
e
user@host $ 

Bytes:

e = Exception()
e.__notes__ = b"a note"
raise e
user@host $ ./repro.py
Traceback (most recent call last):
  File "./repro.py", line 8, in <module>
    raise e
Exception
97
32
110
111
116
101
user@host $ 

Even though the above are all edge cases, since there are some checks that handle these cases already, it makes sense to handle them more gracefully.

Your environment

  • CPython versions tested on: 3.12.0a7+
  • Operating system and architecture: macOS Mojave (x86)

Linked PRs

@pR0Ps pR0Ps added the type-bug An unexpected behavior, bug, or error label Apr 26, 2023
@pR0Ps pR0Ps changed the title No trailing newline when showing broken Exception .__notes__ Issues when showing broken Exception.__notes__ Apr 26, 2023
@gaogaotiantian
Copy link
Member

Is Exception.__notes__ supposed to be directly written? add_note() is definitely the recommended interface to use the feature. The docs mentioned __notes__ as a "list of the notes", and is breaking that a "corner case", or simply the wrong way to use it?

@pR0Ps
Copy link
Contributor Author

pR0Ps commented Apr 26, 2023

It is not supposed to be directly written (as far as I can tell), but while I was experimenting with some unrelated exception handling I was digging into this and noticed the inconsistency with the newlines so I figured I'd make a quick patch.

The only reason I bothered at all is because there's already some amount of handling of invalid notes so it seems it's at least been considered that someone may write Exception.__notes__ directly.

@iritkatriel
Copy link
Member

Merged into 3.12. Leaving open pending decision about backporting to 3.11.

carljm added a commit to carljm/cpython that referenced this issue May 1, 2023
* main: (26 commits)
  pythongh-104028: Reduce object creation while calling callback function from gc (pythongh-104030)
  pythongh-104036: Fix direct invocation of test_typing (python#104037)
  pythongh-102213: Optimize the performance of `__getattr__` (pythonGH-103761)
  pythongh-103895: Improve how invalid `Exception.__notes__` are displayed (python#103897)
  Adjust expression from `==` to `!=` in alignment with the meaning of the paragraph. (pythonGH-104021)
  pythongh-88496: Fix IDLE test hang on macOS (python#104025)
  Improve int test coverage (python#104024)
  pythongh-88773: Added teleport method to Turtle library (python#103974)
  pythongh-104015: Fix direct invocation of `test_dataclasses` (python#104017)
  pythongh-104012: Ensure test_calendar.CalendarTestCase.test_deprecation_warning consistently passes (python#104014)
  pythongh-103977: compile re expressions in platform.py only if required (python#103981)
  pythongh-98003: Inline call frames for CALL_FUNCTION_EX (pythonGH-98004)
  Replace Netlify with Read the Docs build previews (python#103843)
  Update name in acknowledgements and add mailmap (python#103696)
  pythongh-82054: allow test runner to split test_asyncio to execute in parallel by sharding. (python#103927)
  Remove non-existing tools from Sundry skiplist (python#103991)
  pythongh-103793: Defer formatting task name (python#103767)
  pythongh-87092: change assembler to use instruction sequence instead of CFG (python#103933)
  pythongh-103636: issue warning for deprecated calendar constants (python#103833)
  Various small fixes to dis docs (python#103923)
  ...
carljm added a commit to carljm/cpython that referenced this issue May 1, 2023
* main: (463 commits)
  pythongh-104057: Fix direct invocation of test_super (python#104064)
  pythongh-87092: Expose assembler to unit tests (python#103988)
  pythongh-97696: asyncio eager tasks factory (python#102853)
  pythongh-84436: Immortalize in _PyStructSequence_InitBuiltinWithFlags() (pythongh-104054)
  pythongh-104057: Fix direct invocation of test_module (pythonGH-104059)
  pythongh-100458: Clarify Enum.__format__() change of mixed-in types in the whatsnew/3.11.rst (pythonGH-100387)
  pythongh-104018: disallow "z" format specifier in %-format of byte strings (pythonGH-104033)
  pythongh-104016: Fixed off by 1 error in f string tokenizer (python#104047)
  pythonGH-103629: Update Unpack's repr in compliance with PEP 692 (python#104048)
  pythongh-102799: replace sys.exc_info by sys.exception in inspect and traceback modules (python#104032)
  Fix typo in "expected" word in few source files (python#104034)
  pythongh-103824: fix use-after-free error in Parser/tokenizer.c (python#103993)
  pythongh-104035: Do not ignore user-defined `__{get,set}state__` in slotted frozen dataclasses (python#104041)
  pythongh-104028: Reduce object creation while calling callback function from gc (pythongh-104030)
  pythongh-104036: Fix direct invocation of test_typing (python#104037)
  pythongh-102213: Optimize the performance of `__getattr__` (pythonGH-103761)
  pythongh-103895: Improve how invalid `Exception.__notes__` are displayed (python#103897)
  Adjust expression from `==` to `!=` in alignment with the meaning of the paragraph. (pythonGH-104021)
  pythongh-88496: Fix IDLE test hang on macOS (python#104025)
  Improve int test coverage (python#104024)
  ...
@iritkatriel
Copy link
Member

Assigned to @ambv for a backport decision.

@hugovk
Copy link
Member

hugovk commented Nov 10, 2023

@ambv Shall we backport or close this issue?

# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
interpreter-core (Objects, Python, Grammar, and Parser dirs) type-bug An unexpected behavior, bug, or error
Projects
None yet
Development

No branches or pull requests

5 participants