better-exceptions

by Qix-

Pretty and useful exceptions in Python, automatically.

3.8K Stars 193 Forks Last release: almost 3 years ago (0.2.1) MIT License 86 Commits 12 Releases

Available items

No Items, yet!

The developer of this repository has not created any items for sale yet. Need a bug fixed? Help with integration? A different license? Create a request here:

better-exceptions Travis

Pretty and more helpful exceptions in Python, automatically.

Example screenshot of exceptions

Usage

Install

better_exceptions
via pip:
$ pip install better_exceptions

And set the

BETTER_EXCEPTIONS
environment variable to any value:
export BETTER_EXCEPTIONS=1  # Linux / OSX
setx BETTER_EXCEPTIONS 1    # Windows

That's it!

Python REPL (Interactive Shell)

In order to use

better_exceptions
in the Python REPL, first install the package (as instructed above) and run:
$ python -m better_exceptions
Type "help", "copyright", "credits" or "license" for more information.
(BetterExceptionsConsole)
>>>

in order to drop into a

better_exceptions
-enabled Python interactive shell.

Advanced Usage

If you want to allow the entirety of values to be outputted instead of being truncated to a certain amount of characters:

import better_exceptions
better_exceptions.MAX_LENGTH = None

While using

better_exceptions
in production, do not forget to unset the
BETTER_EXCEPTIONS
variable to avoid leaking sensitive data in your logs.

Use with unittest

If you want to use

better_exceptions
to format
unittest
's exception output, you can use the monkey patch below:
import sys
import unittest
import better_exceptions

def patch(self, err, test): lines = better_exceptions.format_exception(*err) if sys.version_info[0] == 2: return u"".join(lines).encode("utf-8") return "".join(lines)

unittest.result.TestResult._exc_info_to_string = patch

Note that this uses an undocumented method override, so it is not guaranteed to work on all platforms or versions of Python.

Django Usage

Tested with Django 1.11

Create a middleware exception handler in a file like

myapp/middleware.py
:
import sys
from better_exceptions import excepthook


class BetterExceptionsMiddleware(object): def init(self, get_response): self.get_response = get_response

def __call__(self, request):
    return self.get_response(request)

def process_exception(self, request, exception):
    excepthook(exception.__class__, exception, sys.exc_info()[2])
    return None

In

settings.py
, add your new class to the
MIDDLEWARE
list:
MIDDLEWARE = [
...
    'myapp.middleware.BetterExceptionsMiddleware',
]

example output:

image

Troubleshooting

If you do not see beautiful exceptions, first make sure that the environment variable does exist. You can try

echo $BETTER_EXCEPTIONS
(Linux / OSX) or
echo %BETTER_EXCEPTIONS%
(Windows). On Linux and OSX, the
export
command does not add the variable permanently, you will probably need to edit the
~/.profile
file to make it persistent. On Windows, you need to open a new terminal after the
setx
command.

Check that there is no conflict with another library, and that the

sys.excepthook
function has been correctly replaced with the
better_exceptions
's one. Sometimes other components can set up their own exception handlers, such as the
python3-apport
Ubuntu package that you may need to uninstall.

Make sure that you have not inadvertently deleted the

better_exceptions_hook.pth
file that should be in the same place as the
better_exceptions
folder where all of your Python packages are installed. Otherwise, try re-installing
better_exceptions
.

You can also try to manually activate the hook by adding

import better_exceptions; better_exceptions.hook()
at the beginning of your script.

Finally, if you still can not get this module to work, open a new issue by describing your problem precisely and detailing your configuration (Python and

better_exceptions
versions, OS, code snippet, interpeter, etc.) so that we can reproduce the bug you are experiencing.

License

Copyright © 2017, Josh Junon. Licensed under the MIT license.

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.