Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

Issues when showing broken Exception.__notes__ #103895

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?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in 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