Seviper - Error handling framework to catch 'em all
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(orpipe.map, analogous to theaiostreamfunctions) 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.
Metadata
Release files for seviper 0.1.2
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 | |
|---|---|---|---|---|
| seviper-0.1.2.tar.gz | 69.1 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| seviper-0.1.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 86.3 kB
Release files / seviper-0.1.2.tar.gz
| Download URL | seviper-0.1.2.tar.gz |
|---|---|
| Size | 69.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
379089fd5f12973251c87be9ae4d013cc3159eed3c73b15159cbcb1731ce2f53
|
|
BLAKE2b-256 checksum How to use checksums |
fd6334266a7ec0a7e71f214acd20685cb1e30a23bd76dadfc3e9d6c6a5a4b735
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / seviper-0.1.2-py3-none-any.whl
| Download URL | seviper-0.1.2-py3-none-any.whl |
|---|---|
| Size | 17.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
093db3838db034adeb8d285edbe2b48ff4a52925ae2e0bc5cdc17fdbd31236d5
|
|
BLAKE2b-256 checksum How to use checksums |
a872b9cd43177d3e5fffac958ae565156d46f36e246f82af72ff4ea7bbd59097
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for seviper 0.1.2
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.