Improve the default excepthook formatting for multi-line and exception notes
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Python
- Estrellas
- 77.2k
- Forks
- 35.9k
- Métricas de merge de PR
- Métricas de PR pendientes
Descripción
Proposal:
Currently, it is possible to add notes to exceptions, see BaseException.add_note, but this feature is underutilized.
One of the reasons for that, I believe, is the poor formatting in the default excepthook:
Current Output
(single note)
$ ./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)
$ ./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
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)
$ ./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.
Current Output
(multi-line string, with no notes)
$./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)
$ ./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
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:
$ ./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
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Comienza con los puntos de entrada predeterminados de CPython para excepthook y el formateo de excepciones; el issue no especifica ningún archivo ni prueba. Compara la salida actual con los ejemplos propuestos de notas de una sola línea y de varias líneas, y considera que está hecho cuando se consigue el formato con estructura de árbol previsto sin perder el contenido del mensaje.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- python
- Área
- backend
- Tipo de issue
- Nueva funcionalidad
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 35/100