Skip to content

Use Python 3.11 exception notes (PEP 678) to provide hints on errors #96958

Closed
@vstinner

Description

@vstinner

Python 3.11 adds BaseException.add_note() method to add "notes" to exceptions (PEP 678). One of the Motivations is providing hints to novices:

programming environments for novices can provide more detailed descriptions of various errors, and tips for resolving them

I propose modifying the few existing errors which already provide hints by converting the sentence to a note: restrict the error message to the actual error, and move hints to notes.

Example of an existing error with a hint:

$ python3 -q
>>> import sys
>>> print >>sys.stderr, "hello"
...
TypeError: unsupported operand type(s) for >>: 'builtin_function_or_method' and '_io.TextIOWrapper'. Did you mean "print(<message>, file=<output_stream>)"?

Currently, the actual error ("unsupported operand") and the hint ("Did you mean...") are displayed on the same line. IMO displaying the hint on a separated line would make it easier to spot (it would be less likely to miss it).

Example raising a note manually to see how it's displayed:

try:
    raise TypeError("unsupported operand")
except Exception as exc:
    exc.add_note("Did you mean...")
    raise

Current Python 3.12 output:

Traceback (most recent call last):
  File "bug.py", line 2, in <module>
    raise TypeError("unsupported operand")
TypeError: unsupported operand
Did you mean...

I proposed PR #96878 to add _PyErr_AddNote() function to the internal C API.


I found these hints:

  • "Use sys.set_int_max_str_digits() to increase the limit": see PR gh-95778: Use a note for the max digits error message #96878
  • print >> 123: unsupported operand ...: Did you mean "print(<message>, "file=<output_stream>)"?
  • 1 is 2: "is" with a literal. Did you mean "=="?
  • 1 is not 2: "is" with a literal. Did you mean "!="?
  • "Suggestions" added by PyErr_Display() with _Py_Offer_Suggestions() (issue Offer suggestions on AttributeError and NameError #82711) is not a good fit: this code doesn't modify the exception on purpose
  • print "hello": Missing parentheses in call to 'print'. Did you mean print(...)? (similar error on exec code)

Metadata

Metadata

Assignees

No one assigned

    Labels

    type-bugAn unexpected behavior, bug, or error

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions