A nicer drop-in-replacement for Python sys.excepthook, i.e. it prints stack traces with extended information. It will add some useful information for each frame, like printing the relevant variables (relevant = referenced in the code line).
Features
Shows locals/globals per frame, but only those used in the current statement. It does this by a simple Python code parser. By default, we exclude builtins, undefined names, bound methods (when accessed via the original attribute), modules, top-level module functions.
Multi-line Python statements in the stack trace output, in case the statement goes over multiple lines.
Shows full function qualified name (not just co_name).
Colored/formatted output of each frame.
Syntax highlighting for the Python source code.
Support for DomTerm text folding (see more), where it folds all the details of each stack frame away by default, and thus provides a much more comprehensive overview, while still providing all the details when needed.
Installation
You can just copy over the single file better_exchook.py to your project.
Or alternatively, it is also available on PyPI and can be installed via:
pip install better_exchook
Usage
import better_exchook
better_exchook.install() # will just do: sys.excepthook = better_exchook
Or:
import better_exchook
better_exchook.setup_all()
API:
- setup_all()
install() + replace_traceback_format_tb() + replace_traceback_print_tb()
- install():
sys.excepthook = better_exchook
- replace_traceback_format_tb():
traceback.format_tb = format_tb
traceback.StackSummary.format = format_tb
traceback.StackSummary.extract = _StackSummary_extract
- replace_traceback_print_tb():
traceback.print_tb = print_tb
traceback.print_exception = print_exception
traceback.print_exc = print_exc
- better_exchook(exc_type, exc_value, tb, …) / print_exception(exc_type, exc_value, tb, …):
Prints the exception and its traceback with extended information.
- format_tb(tb, …) -> list[str]:
Formats the traceback with extended information, returning a string for every frame. The string per frame includes a newline at the end.
Examples
Python example code:
try:
x = {1:2, "a":"b"}
def f():
y = "foo"
x, 42, sys.stdin.__class__, sys.exc_info, y, z
f()
except Exception:
better_exchook.better_exchook(*sys.exc_info())
Output:
EXCEPTION
Traceback (most recent call last):
File "/Users/az/Programmierung/py_better_exchook/demo.py", line 23, in demo
line: f()
locals:
f = <local> <function demo.<locals>.f at 0x10328f740>
File "/Users/az/Programmierung/py_better_exchook/demo.py", line 21, in demo.<locals>.f
line: x, 42, sys.stdin.__class__, sys.exc_info, y, z # noqa: F821
locals:
x = <local> {1: 2, 'a': 'b'}
sys.stdin = <global> <_io.TextIOWrapper name='<stdin>' mode='r' encoding='utf-8'>
sys.stdin.__class__ = <global> <class '_io.TextIOWrapper'>
y = <local> 'foo'
NameError: name 'z' is not defined
Python example code:
try:
(lambda _x: None)(
__name__,
42,
) # multiline
except Exception:
better_exchook(*sys.exc_info())
Output:
EXCEPTION
Traceback (most recent call last):
File "/Users/az/Programmierung/py_better_exchook/demo.py", line 29, in demo
line: (lambda _x: None)(
__name__,
42,
) # multiline
locals:
__name__ = <global> '__main__', len = 8
TypeError: demo.<locals>.<lambda>() takes 1 positional argument but 2 were given
Python example code:
# use this to overwrite the global exception handler
sys.excepthook = better_exchook.better_exchook
# and fail
raise ValueError("final failure: %s" % ((sys, f1, 123),))
Output:
EXCEPTION
Traceback (most recent call last):
File "/Users/az/Programmierung/py_better_exchook/demo.py", line 106, in <module>
line: main()
locals:
main = <local> <function main at 0x103071c60>
File "/Users/az/Programmierung/py_better_exchook/demo.py", line 102, in main
line: demo()
File "/Users/az/Programmierung/py_better_exchook/demo.py", line 69, in demo
line: raise ValueError("final failure: %s" % ((sys, f1, 123),))
locals:
f1 = <local> <function demo.<locals>.f1 at 0x1030d1da0>
ValueError: final failure: (<module 'sys' (built-in)>, <function demo.<locals>.f1 at 0x1030d1da0>, 123)
Screenshot:
Screencast with DomTerm using text folding (see more):
Status
This has been used in production for many years (since 2011) and should be fairly stable (and has a save fallback mode).
Details
Also see Python source and comments for further details.
Similar projects
IPython has something similar (ultratb). Do this: from IPython.core import ultratb; sys.excepthook = ultratb.VerboseTB(). Shows more source code context (but not necessarily all relevant parts).
Ka-Ping Yee’s “cgitb.py”, which is part of Python, see here, code here.
Rich Python library. Syntax highlighting but without locals.
andy-landy / traceback_with_variables. Python Traceback (Error Message) Printing Variables. Very similar, but less advanced. Only shows locals, not globals, and also just all locals, not only those used in current statement. Also does not expand statement if it goes over multiple lines.
cknd / stackprinter. Similar as IPython ultratb.
Qix- / better-exceptions. Pretty-print Python exceptions and their tracebacks. Adds content of relevant variables from the current source line, but only top-level names, not attributes of objects (for a.b, only print a). Also does not support multi-line statements, and no full function qualified names. Also currently (2025-06) broken for Python 3.13.
friendly-traceback. Prints tracebacks with added explanations, intended for Python beginners.
skorokithakis / tbvaccine. Pretty-print Python tracebacks. Automatically highlights lines you care about. Can print all locals of a frame (but no selection of only relevant ones, no globals).
alexmojaki / stack_data. Extracts data from stack frames.
See this related StackOverflow question.
– Albert Zeyer, <http://www.az2000.de>
Metadata
Release files for better-exchook 1.20250620.101151
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| better_exchook-1.20250620.101151.tar.gz | 27.9 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| better_exchook-1.20250620.101151-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 55.0 kB
Release files / better_exchook-1.20250620.101151.tar.gz
| Download URL | better_exchook-1.20250620.101151.tar.gz |
|---|---|
| Size | 27.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
24a0e912c199bb3452be54f68d2051f519a0711a26cdbd4e99f223a9f2457bc8
|
|
BLAKE2b-256 checksum How to use checksums |
c2a8147ac1367d09e8a95fbf4213415680e405ee7560a1a825b5c8f53f71daa0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.9.23
|
Release files / better_exchook-1.20250620.101151-py3-none-any.whl
| Download URL | better_exchook-1.20250620.101151-py3-none-any.whl |
|---|---|
| Size | 27.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
10ea2a6e49f04a8d8472b5cd49595bb372ebd0e170c87512ee4c8389b309953d
|
|
BLAKE2b-256 checksum How to use checksums |
a3de5ca67337974684d8e16f8a085b4f4c074d6406e95510cbf9711b3c8a106d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.9.23
|
Security for better-exchook 1.20250620.101151
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.