mirror of
https://github.com/Sneed-Group/Poodletooth-iLand
synced 2024-12-29 06:32:40 -06:00
50 lines
1.5 KiB
Python
50 lines
1.5 KiB
Python
# Copyright (c) 2009 Denis Bilenko. See LICENSE for details.
|
|
__all__ = ['wrap_errors']
|
|
|
|
import sys
|
|
|
|
|
|
class wrap_errors(object):
|
|
"""Helper to make function return an exception, rather than raise it.
|
|
|
|
Because every exception that is unhandled by greenlet will be logged,
|
|
it is desirable to prevent non-error exceptions from leaving a greenlet.
|
|
This can done with simple ``try``/``except`` construct::
|
|
|
|
def wrapped_func(*args, **kwargs):
|
|
try:
|
|
return func(*args, **kwargs)
|
|
except (A, B, C), ex:
|
|
return ex
|
|
|
|
:class:`wrap_errors` provides a shortcut to write that in one line::
|
|
|
|
wrapped_func = wrap_errors((A, B, C), func)
|
|
|
|
It also preserves ``__str__`` and ``__repr__`` of the original function.
|
|
"""
|
|
# QQQ could also support using wrap_errors as a decorator
|
|
|
|
def __init__(self, errors, func):
|
|
"""Make a new function from `func', such that it catches `errors' (an
|
|
Exception subclass, or a tuple of Exception subclasses) and return
|
|
it as a value.
|
|
"""
|
|
self.errors = errors
|
|
self.func = func
|
|
|
|
def __call__(self, *args, **kwargs):
|
|
func = self.func
|
|
try:
|
|
return func(*args, **kwargs)
|
|
except self.errors:
|
|
return sys.exc_info()[1]
|
|
|
|
def __str__(self):
|
|
return str(self.func)
|
|
|
|
def __repr__(self):
|
|
return repr(self.func)
|
|
|
|
def __getattr__(self, item):
|
|
return getattr(self.func, item)
|