### Proposal: Currently, it is possible to add [notes](https://docs.python.org/3/library/exceptions.html#BaseException.__notes__) to exceptions, see [`BaseException.add_note`](https://docs.python.org/3/library/exceptions.html#BaseException.add_note), but this feature is underutilized. One of the reasons for that, I believe, is the poor formatting in the default excepthook: <details> <summary>Current Output</summary> (single note) ```py $ ./python Python 3.14.0a2+ experimental free-threading build (heads/gh-127429-dirty:cc4f57a74d0, Dec 1 2024, 07:06:51) [GCC 14.2.1 20240910] on linux Type "help", "copyright", "credits" or "license" for more information. >>> try: ... raise Exception('error') ... except Exception as e: ... e.add_note('some context') ... raise ... Traceback (most recent call last): File "<python-input-0>", line 2, in <module> raise Exception('error') Exception: error some context ``` (with multiple notes) ```py $ ./python Python 3.14.0a2+ experimental free-threading build (heads/gh-127429-dirty:cc4f57a74d0, Dec 1 2024, 07:06:51) [GCC 14.2.1 20240910] on linux Type "help", "copyright", "credits" or "license" for more information. >>> try: ... raise Exception('error') ... except Exception as e: ... e.add_note('some context') ... e.add_note('some context 2') ... e.add_note('some context 3') ... raise ... Traceback (most recent call last): File "<python-input-0>", line 2, in <module> raise Exception('error') Exception: error some context some context 2 some context 3 ``` </details> I think if we formatted it better, making the output easier to understand, we could start seeing better adoption of this feature. (with multiple notes) ```py $ ./python Python 3.14.0a2+ experimental free-threading build (heads/gh-127429-dirty:cc4f57a74d0, Dec 1 2024, 07:06:51) [GCC 14.2.1 20240910] on linux Type "help", "copyright", "credits" or "license" for more information. >>> try: ... raise Exception('error') ... except Exception as e: ... e.add_note('some context') ... e.add_note('some context 2') ... e.add_note('some context 3') ... raise ... Traceback (most recent call last): File "<python-input-0>", line 2, in <module> raise Exception('error') Exception: error ├── Note: some context ├── Note: some context 2 └── Note: some context 3 ``` --- In addition to this, multiline exception messages could also be improved. <details> <summary>Current Output</summary> (multi-line string, with no notes) ```py $./python Python 3.14.0a2+ experimental free-threading build (heads/gh-127429-dirty:cc4f57a74d0, Dec 1 2024, 07:06:51) [GCC 14.2.1 20240910] on linux Type "help", "copyright", "credits" or "license" for more information. >>> raise Exception('some error\n\nsome context\nsome context (cont.)\n\nsome extra context') Traceback (most recent call last): File "<python-input-0>", line 1, in <module> raise Exception('some error\n\nsome context\nsome context (cont.)\n\nsome extra context') Exception: some error some context some context (cont.) some extra context ``` (multi-line string, with multi-line notes) ```py $ ./python Python 3.14.0a2+ experimental free-threading build (heads/gh-127429-dirty:cc4f57a74d0, Dec 1 2024, 07:06:51) [GCC 14.2.1 20240910] on linux >>> try: ... raise Exception('some error\n\nsome error text\nsome error text (cont.)\n\nsome more error text') ... except Exception as e: ... e.add_note('some context\nsome context (cont.)') ... e.add_note('some context 2\n\nsome extra context 2') ... e.add_note('some context 3\nsome context 3 (cont.)\n\nsome extra context 3') ... raise ... Traceback (most recent call last): File "<python-input-0>", line 2, in <module> raise Exception('some error\n\nsome error text\nsome error text (cont.)\n\nsome more error text') Exception: some error some error text some error text (cont.) some more error text some context some context (cont.) some context 2 some extra context 2 some context 3 some context 3 (cont.) some extra context 3 ``` </details> The first example IMO isn't optimal, but it's okay enough, but the second example is very confusing. We could format it something like: ```py $ ./python Python 3.14.0a2+ experimental free-threading build (heads/gh-127429-dirty:cc4f57a74d0, Dec 1 2024, 07:06:51) [GCC 14.2.1 20240910] on linux >>> try: ... raise Exception('some error\n\nsome error text\nsome error text (cont.)\n\nsome more error text') ... except Exception as e: ... e.add_note('some context\nsome context (cont.)') ... e.add_note('some context 2\n\nsome extra context 2') ... e.add_note('some context 3\nsome context 3 (cont.)\n\nsome extra context 3') ... raise ... Traceback (most recent call last): File "<python-input-0>", line 2, in <module> raise Exception('some error\n\nsome error text\nsome error text (cont.)\n\nsome more error text') Exception: │ │ some error │ │ │ │ some error text │ │ some error text (cont.) │ │ │ └ some more error text │ ├── Note: │ │ some context │ └ some context (cont.) │ ├── Note: │ │ some context 2 │ │ │ └ some extra context 2 │ └── Note: │ some context 3 │ some context 3 (cont.) │ └ some extra context 3 ``` ### Has this already been discussed elsewhere? No response given ### Links to previous discussion of this feature: _No response_