Skip to content

grimen/python-mybad

Repository files navigation

mybad PyPI version Build Status Coverage Status

My friendly error base class - for Python.

Introduction

One in general always needs a application/library specific error base class, but the native errors are very limited in what meta/debugging information they can hold at time they are raised. For better debugging and error reporting/inspection this error base class allows to attach some additonal error context information that can be used to better understand the issue - without having to create custom error formatters, or run debugger.

Install

Install using pip:

$ pip install mybad

Use

Very basic example:

from mybad import Error

class ToMuchError(Error):
    pass

def print_money(stash):
    try:
        if isinstance(stash, str) and len(stash) > 13:
            raise Exception('Too much money to print: {0}'.format(stash))

        print('PRINT {0}'.format(stash))

    except Exception as error:
        raise ToMuchError(error,
            message = 'Out of money printing ink...',
            id = hash(stash),
            key = 'too_much',
            code = 400,
            details = dict(
                stash = stash,
            )
        )

amount = ''

for dollar in range(42):
    amount += '$'

    print_money(amount)

Run this with optional environment variables COLORS / ERROR_COLORS and/or VERBOSE / ERROR_VERBOSE set too truthy or falsy values, so see various error info formatting in terminal.

Something like this (imagine some colorized formatting):

PRINT $
PRINT $$
PRINT $$$
PRINT $$$$
PRINT $$$$$
PRINT $$$$$$
PRINT $$$$$$$
PRINT $$$$$$$$
PRINT $$$$$$$$$
PRINT $$$$$$$$$$
PRINT $$$$$$$$$$$
PRINT $$$$$$$$$$$$
PRINT $$$$$$$$$$$$$
===============================
     str(error)
---------------------------
Out of money printing ink... - {'stash': '$$$$$$$$$$$$$$'}

===============================
     error.stack
---------------------------
Traceback (most recent call last):
  File "examples/basic.py", line 27, in print_money
    raise Exception('Too much money to print: {0}'.format(stash))
Exception: Too much money to print: $$$$$$$$$$$$$$

===============================
     error.inspect()
---------------------------
{   'code': 400,
    'details': {'stash': '$$$$$$$$$$$$$$'},
    'id': 3563898309523127190,
    'key': 'too_much',
    'message': 'Out of money printing ink...',
    'stack': [   {   'code': ['stash = stash,'],
                     'file': 'examples/basic.py',
                     'function': 'print_money',
                     'line': 38},
                 {   'code': ['print_money(amount)'],
                     'file': 'examples/basic.py',
                     'function': '<module>',
                     'line': 48}],
    'type': 'ToMuchError'}


===============================
     error.json()
---------------------------
{
    "type": "ToMuchError",
    "id": 3563898309523127190,
    "code": 400,
    "key": "too_much",
    "message": "Out of money printing ink...",
    "details": {
        "stash": "$$$$$$$$$$$$$$"
    },
    "stack": [
        {
            "file": "examples/basic.py",
            "function": "print_money",
            "line": 38,
            "code": [
                "stash = stash,"
            ]
        },
        {
            "file": "examples/basic.py",
            "function": "<module>",
            "line": 48,
            "code": [
                "print_money(amount)"
            ]
        }
    ]
}

Test

Clone down source code:

$ make install

Run colorful tests, with only native environment (dependency sandboxing up to you):

$ make test

Run less colorful tests, with multi-environment (using tox):

$ make test-tox

Related

  • node-mybad - "My friendly error base class - for Node/JavaScript"
  • python-mybase - "My friendly library base class - for Python"

About

This project was mainly initiated - in lack of solid existing alternatives - to be used at our work at Markable.ai to have common code conventions between various programming environments where Python (research, CV, AI) is heavily used.

License

Released under the MIT license.