Skip to main content

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.

https://github.com/albertz/py_better_exchook/workflows/CI/badge.svg

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:

https://gist.githubusercontent.com/albertz/a4ce78e5ccd037041638777f10b10327/raw/2cda70f8c5c0478e545640369ebf58d49bf0001c/screenshot2.png

Screencast with DomTerm using text folding (see more):

https://gist.githubusercontent.com/albertz/a4ce78e5ccd037041638777f10b10327/raw/7ec2bb7079dbd56119d498f20905404cb2d812c0/screencast-domterm.gif

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

  • Nose does something similar for assertion failures.

  • 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.

  • patrys / great-justice

  • 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.

  • onelivesleft / PrettyErrors

  • 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>

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

better_exchook-1.20260807.15533.tar.gz (29.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

better_exchook-1.20260807.15533-py3-none-any.whl (29.3 kB view details)

Uploaded Python 3

File details

Details for the file better_exchook-1.20260807.15533.tar.gz.

File metadata

File hashes

Hashes for better_exchook-1.20260807.15533.tar.gz
Algorithm Hash digest
SHA256 9c03977a19cee16ca4513f79b2b653326d900bdd994b17306529de61b6aea7fc
MD5 5b9d75753383f0caa88a57e34be7c845
BLAKE2b-256 e766cee17dfcce3904c5d09c7fe22e1eb62fd6b4a80a8ed27be091d078bb6b45

See more details on using hashes here.

File details

Details for the file better_exchook-1.20260807.15533-py3-none-any.whl.

File metadata

File hashes

Hashes for better_exchook-1.20260807.15533-py3-none-any.whl
Algorithm Hash digest
SHA256 06b0e1efb2c2f725851f8f4e114d1b6c314cb113390a4ef62c749b3128f753ea
MD5 967b16efd41f11999908e77a8bb1ea34
BLAKE2b-256 ed50ba66537b50685f2223ca592d5cb3c001415ec0518c4f806e4aa82d480226

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

1.20260807.15533 This release

2 files

1.20250619.746

2 files

1.20250619.45

2 files

1.20240112.4845

1 file

1.20240112.3546

1 file

1.20160612.132345

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page