@@ -82,29 +82,38 @@ def do_error(value: UT) -> NoReturn:
8282 @staticmethod
8383 def do (* , error : type [UE ] = object ) -> "Callable[[Callable[TArgs, UT]], Callable[TArgs, Result[UT, UE]]]" :
8484 def decorator (func ):
85+ def handle_exception (raised : Exception ):
86+ match raised :
87+ case ResultDoError () as do_error :
88+ return Result .error (do_error .value )
89+ case Exception () as unknown_exception :
90+ print ('[outer-scout-blender]' , unknown_exception )
91+ return Result .error (str (raised ))
92+
93+ def wrap_return_value (return_value ):
94+ if isinstance (return_value , Result ):
95+ return return_value
96+ return Result .ok (return_value )
97+
8598 if isgeneratorfunction (func ):
8699
87100 @wraps (func )
88101 def wrapper (* args , ** kwargs ):
89102 try :
90103 return_value = yield from func (* args , ** kwargs )
91- except ResultDoError as do_error :
92- return_value = Result .error (do_error .value )
93- if not isinstance (return_value , Result ):
94- return_value = Result .ok (return_value )
95- return return_value
104+ except Exception as exception :
105+ return_value = handle_exception (exception )
106+ return wrap_return_value (return_value )
96107
97108 else :
98109
99110 @wraps (func )
100111 def wrapper (* args , ** kwargs ):
101112 try :
102113 return_value = func (* args , ** kwargs )
103- except ResultDoError as do_error :
104- return_value = Result .error (do_error .value )
105- if not isinstance (return_value , Result ):
106- return_value = Result .ok (return_value )
107- return return_value
114+ except Exception as exception :
115+ return_value = handle_exception (exception )
116+ return wrap_return_value (return_value )
108117
109118 return wrapper
110119
@@ -124,4 +133,3 @@ def __repr__(self) -> str:
124133 if self .is_ok :
125134 return f"Ok({ self .__value !r} )"
126135 return f"Error({ self .__error !r} )"
127-
0 commit comments