Unless is a lightweight python library designed to simplify error handling. It introduces the Result
class that encapsulates the result of a function call, which can be either the return value, an error, or both.
pip3 install unless-handler
💡 Remember
Result
class has 2 properties and 1 method,
Properties
value
- The return value of the functionerror
- Information about the error if there was any
- It can be either a tuple of the exception type and traceback string, or just the traceback string
Methods
unless
- Handle errors and return thevalue
-
Import the
Result
class andtraceback.format_exc
for tracebacksfrom unless import Result from traceback import format_exc # Optional
-
Integrate
Result
into your function-
Initialize the
Result
class (specify the return type for type hints)def cool(): to_return = Result[list]() ^ Return type
[list]
is the return type of the function and is there so we can have type hints. It is OPTIONAL andResult()
works too. -
Set the return value
- Use
value
property of theResult
class to set return value
# <initialized>.value = <value to return> to_return.value = [1, 2, 3]
- Use
-
Catch and set errors
- Use
error
property of theResult
class to set errors - You have the freedom to set any value you like; however, it is recommended to follow the given syntax of
<type>, <traceback>
as it gives the ability to have caused exception type and the traceback for better error handling
try: ... except Exception as e: # <initialized>.error = <exception type>, <traceback.format_exc()> to_return.error = type(e), format_exc()
- Use
-
Return the result
return to_return
-
-
Calling your function
-
See result using the
value
propertycalled = my_function() called.value
-
See error using the
error
propertycalled.error
-
Or better yet, use the
unless
methodcalled = my_function().unless() # called is now called.value and errors are handled using handler function # for more info check "Examples"
-
def cool():
to_return = Result[list]()
try:
to_return.value = [1, 2, 3]
raise ValueError("Annoying error...")
except Exception as e:
to_return.error = type(e), traceback.format_exc()
return to_return
# Calling the function
x = cool().unless()
print(x)
You can call functions with custom error handling logic using Result.unless
method that your function returns.
- You can pass any python function to the
unless
method - Your handler function must accept at least 1 argument
- If you're using
Result.from_func
or following the recommended syntax, the 1st argument will be a tuple consist of<type of exception>, <traceback string>
- If you're using
- Handler function can have keyword arguments (
x.unless(func, arg1="first", arg2="second")
)
def custom_handler(e, notes):
_, fmt_traceback = e
logging.warn(f"{fmt_traceback} \n\nNotes: {notes}")
x = cool().unless(
custom_handler,
notes="Probably happend because the function was hot"
)
print(x)
You can use Result.from_func
method to integrate this with existing functions.
- As a decorator,
@Result.from_func def older(n) -> list: return [1, 2, 3, n]
- As a function,
def older(n) -> list: return [1, 2, 3, n] x = Result.from_func(older, list, n=2) # Important: # if your function doesn't accept arguments, use "()" at the end to call it properly # Example: x = Result.from_func(no_args)() ^ Call the function