forked from s_ranjbar/city_retrofit
50 lines
1.2 KiB
Python
50 lines
1.2 KiB
Python
|
"""
|
||
|
exceptions.py
|
||
|
----------------
|
||
|
|
||
|
Handle things related to exceptions.
|
||
|
"""
|
||
|
|
||
|
|
||
|
class ExceptionModule(object):
|
||
|
"""
|
||
|
Create a dummy module which will raise an exception when attributes
|
||
|
are accessed.
|
||
|
|
||
|
For soft dependencies we want to survive failing to import but
|
||
|
we would like to raise an appropriate error when the functionality is
|
||
|
actually requested so the user gets an easily debuggable message.
|
||
|
"""
|
||
|
|
||
|
def __init__(self, exc):
|
||
|
self.exc = exc
|
||
|
|
||
|
def __getattribute__(self, *args, **kwargs):
|
||
|
# if it's asking for our class type return None
|
||
|
# this allows isinstance() checks to not re-raise
|
||
|
if args[0] == '__class__':
|
||
|
return None.__class__
|
||
|
# otherwise raise our original exception
|
||
|
raise super(ExceptionModule, self).__getattribute__('exc')
|
||
|
|
||
|
|
||
|
def closure(exc):
|
||
|
"""
|
||
|
Return a function which will accept any arguments
|
||
|
but raise the exception when called.
|
||
|
|
||
|
Parameters
|
||
|
------------
|
||
|
exc : Exception
|
||
|
Will be raised later
|
||
|
|
||
|
Returns
|
||
|
-------------
|
||
|
failed : function
|
||
|
When called will raise `exc`
|
||
|
"""
|
||
|
# scoping will save exception
|
||
|
def failed(*args, **kwargs):
|
||
|
raise exc
|
||
|
return failed
|