Skip to main content

A simple and easy to use library to catch and handle exceptions.

Project description

Seviper - Error handling framework to catch 'em all

Unittests status badge Coverage status badge Linting status badge Black status badge

Features

This framework provides several error handlers to catch errors and call callback functions to handle these errors (or successes). It comes fully equipped with:

  • A decorator to handle errors in functions or coroutines
  • A decorator to retry a function or coroutine if it fails (can be useful for network requests)
  • A context manager to handle errors in a block of code

Additionally, if you use aiostream (e.g. using pip install seviper[aiostream]), you can use the following features:

  • The stream.map (or pipe.map, analogous to the aiostream functions) function to run the function, catch all exceptions and call the error handler if an exception occurs. Additionally, filters out all failed results.

Installation

pip install seviper

or optionally:

pip install seviper[aiostream]

Usage

Here is a more or less complex example as showcase of the features of this library:

import asyncio
import logging
import sys
import aiostream
import error_handler

logging.basicConfig(stream=sys.stdout, level=logging.DEBUG, force=True)
logger = logging.root
op = aiostream.stream.iterate(range(10))


def log_error(error: Exception, num: int):
    """Only log error and reraise it"""
    logger.error("double_only_odd_nums_except_5 failed for input %d. ", num)
    raise error


@error_handler.decorator(on_error=log_error)
async def double_only_odd_nums_except_5(num: int) -> int:
    if num % 2 == 0:
        raise ValueError(num)
    with error_handler.context_manager(on_success=lambda: logging.info("Success: %s", num)):
        if num == 5:
            raise RuntimeError("Another unexpected error. Number 5 will not be doubled.")
        num *= 2
    return num


def catch_value_errors(error: Exception, _: int):
    if not isinstance(error, ValueError):
        raise error


def log_success(result_num: int, provided_num: int):
    logger.info("Success: %d -> %d", provided_num, result_num)


op = op | error_handler.pipe.map(
    double_only_odd_nums_except_5,
    on_error=catch_value_errors,
    on_success=log_success,
    wrap_secured_function=True,
    suppress_recalling_on_error=False,
)

result = asyncio.run(aiostream.stream.list(op))

assert result == [2, 6, 5, 14, 18]

This outputs:

ERROR:root:double_only_odd_nums_except_5 failed for input 0.
INFO:root:Success: 2
INFO:root:Success: 1 -> 2
ERROR:root:double_only_odd_nums_except_5 failed for input 2.
INFO:root:Success: 6
INFO:root:Success: 3 -> 6
ERROR:root:double_only_odd_nums_except_5 failed for input 4.
INFO:root:Success: 5 -> 5
ERROR:root:double_only_odd_nums_except_5 failed for input 6.
INFO:root:Success: 14
INFO:root:Success: 7 -> 14
ERROR:root:double_only_odd_nums_except_5 failed for input 8.
INFO:root:Success: 18
INFO:root:Success: 9 -> 18

How to use this Repository on Your Machine

Please refer to the respective section in our Python template repository to learn how to use this repository on your machine.

Contribute

You are very welcome to contribute to this template repository by opening a pull request against the main branch.

Project details


Download files

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

Source Distribution

seviper-0.1.1.tar.gz (19.3 kB view details)

Uploaded Source

Built Distribution

seviper-0.1.1-py3-none-any.whl (17.4 kB view details)

Uploaded Python 3

File details

Details for the file seviper-0.1.1.tar.gz.

File metadata

  • Download URL: seviper-0.1.1.tar.gz
  • Upload date:
  • Size: 19.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for seviper-0.1.1.tar.gz
Algorithm Hash digest
SHA256 1588d109d59be8215e99750539947d38565825d88fd4534548213e57361b642f
MD5 135117efc71ad73e39ed12a079a68c4c
BLAKE2b-256 83db3a456933d06c8f7a1f6188631edc67e5356c5534ed424109a70977992501

See more details on using hashes here.

File details

Details for the file seviper-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: seviper-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 17.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for seviper-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 bf8f334db6734d1b919478ccda7109605bdfb038a80c4a7b2fd5c0da3ce62059
MD5 06c5e22e75084ab759ccef9d8f63d607
BLAKE2b-256 a3d446c922223e86a95a7dd94fae949098cca5309da21df446f8a931dad70c5a

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page