a Python library written in C++ - Manage exceptions.
Install - Usage - Memory Usage - Speed
⚠️ NOTE: I archived this project because i found a little memory leak in this c++ part, i couldn't solve that.
Version: 1.3.2 - Thread-Safe (License: GNU GPLv3)
import pyexc
@pyexc.setCallback
def handle_exceptions(state, exc):
pyexc.printExc(state=state)
try:
# ...
except Exception as e:
pyexc.setExc(e) # will call handle_exceptionsNOTE
This repo is my practice to learn Python C Extension ...
PIP:
pip3 install -U git+https://github.com/awolverp/pyexcIf you don't want to install C++ extension, use these commands:
Linux / MacOS:
CEXTENSION=0 pip3 install -U git+https://github.com/awolverp/pyexcWindows:
set CEXTENSION=0
pip3 install -U git+https://github.com/awolverp/pyexcNOTE: if you haven't c++ compiler, the extension isn't installed automatically.
How it works? Its function is very simple. Suppose you have a dictionary whose key is the number named state and value is Exception.
You put any exception to this dictionary with setExc function and manage that by other functions.
- Content:
Pyexc includes 13 functions:
If an exception is occurred, returns True, otherwise False.
pyexc.occurred(state: int = ...) -> boolIf an exception is occurred and successfully erased, Returns True, otherwise False.
pyexc.clear(state: int = ...) -> boolIf any exception is occurred and successfully erased, returns True, otherwise False.
pyexc.clearAll() -> boolReturns the exception which is occurred in state scope.
If any exception not occurred in state scope, returns None.
getExc(state: int = ...) -> BaseException | Type[BaseException] | NoneSet an exception in state scope.
- Parameters:
-
exc: An instance of
BaseException. -
state: scope.
-
block: If True and already any exception have occurred in
statescope, returnsFalse.
-
Returns: True if setted, otherwise False.
setExc(exc: BaseException | Type[BaseException], state: int = ..., block: bool = ...) -> boolRaise the exception which is occurred in state scope.
If any exception not occurred in state scope, will raise SystemError.
- Parameters:
-
state: scope.
-
clear: will erase the exception after raise - default
True.
-
raiseExc(state: int = ..., clear: bool = ...) -> NoReturnPrint the exception which is occurred in state scope.
- Parameters:
-
state: scope.
-
clear: will erase the exception after print - default
True.
-
printExc(state: int = ..., clear: bool = ...) -> boolSet callback function.
The callback function will call after each use of setExc.
- Callback Function Arguments:
-
state (
int): scope. -
exc (
BaseException | Type[BaseException]): An instance of BaseException.
-
setCallback(callback: (int, BaseException | Type[BaseException]) -> None) -> None:Calls func with args and kwargs parameters.
If func raised exception, exception will sets in state scope and returns None.
- Parameters:
-
func (
Callable): function. -
state (
int): scope. -
args (
tuple): function args. -
kwargs (
dict[str, Any]): function kwargs.
-
call(func: (...) -> Any, state:int=0, args:tuple=(), kwargs:dict={}) -> AnyNote: [C EXTENSION bug]:
pyexc.callhas a bug in c extension that doesn't keep exception values and just keeps type of it.
Like pyexc.call but returns exception instead of set in state scope.
rcall(func: (...) -> Any, args:tuple=(), kwargs:dict={}) -> AnyNote: [C EXTENSION bug]:
pyexc.rcallhas a bug in c extension that doesn't return exception values and just returns type of it.
Returns len(states).
lenStates() -> intReturns the biggest number of states.
maxState() -> intReturns states.
states() -> list[int]Returns PyExc version as tuple.
version() -> tuple[int, int, int]Returns allocated memory size in Bytes.
__sizeof__() -> intimport pyexc
def foo():
try:
# ... some code
except Exception as e:
pyexc.setExc(e, state=1)
foo()
if pyexc.occurred(state=1):
pyexc.raiseExc(state=1)import pyexc
def foo():
for i in range(100):
try:
# ... some code
except Exception as e:
pyexc.setExc(e, state=i)
foo()
if pyexc.lenStates() != 0:
for state in pyexc.states():
exc = pyexc.getExc(state=state)
# ...import threading
import time
import pyexc
def handler():
for i in range(10):
pyexc.setExc(TypeError(i))
time.sleep(0.2)
def getter():
for i in range(10):
pyexc.printExc()
time.sleep(0.2)
t1 = threading.Thread(target=handler)
t2 = threading.Thread(target=getter)
t1.start()
t2.start()
t1.join()
t2.join()import threading
import pyexc
def getter(state, exc):
pyexc.printExc(state=state)
pyexc.setCallback(getter)
def handler():
for i in range(10):
pyexc.setExc(TypeError(i))
time.sleep(0.2)
t1 = threading.Thread(target=handler)
t1.start()
t1.join()PyExc uses Very Low memory. 1/3 dict memory usage.
>>> import pyexc
>>> for i in range(1000): pyexc.setExc(TypeError(), state=i)
>>> pyexc.__sizeof__()
12000 # 12000 Bytes
>>> d = dict()
>>> for i in range(1000): d[i] = TypeError()
>>> d.__sizeof__()
36944 # 36944 BytesPyExc is slower than dict.
>>> import pyexc
>>> %timeit for i in range(1000): pyexc.setExc(TypeError(), state=i)
1000 loops, best of 5: 599 µs per loop
>>> d = dict()
>>> %timeit for i in range(1000): d[i] = TypeError()
1000 loops, best of 5: 124 µs per loop- Add python code
- Add
callfunction - Add
rcallfunction - Add
toStringfunction - Add
writeTofunction