рдЕрдкрдиреЗ рдЦрд╛рд▓реА рд╕рдордп рдореЗрдВ рдореИрдВ рдЕрдкрдиреЗ
рдЫреЛрдЯреЗ рд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВред рдкрд╛рдпрдерди v3.x + SQLAlchemy рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рд╢рд╛рдпрдж рдореИрдВ рдХрд┐рд╕реА рджрд┐рди рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦреВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдЖрдЬ рдореИрдВ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХред рдЖрдк рдХрд╕реНрдЯрдо рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд░ рднреА рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдбреЗрдХреЛрд░реЗрдЯрд░ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
import asyncio from asyncio import QueueEmpty, QueueFull from concurrent.futures import TimeoutError class ProcessException(object): __slots__ = ('func', 'custom_handlers', 'exclude') def __init__(self, custom_handlers=None): self.func = None self.custom_handlers: dict = custom_handlers self.exclude = [QueueEmpty, QueueFull, TimeoutError] def __call__(self, func, *a): self.func = func def wrapper(*args, **kwargs): if self.custom_handlers: if isinstance(self.custom_handlers, property): self.custom_handlers = self.custom_handlers.__get__(self, self.__class__) if asyncio.iscoroutinefunction(self.func): return self._coroutine_exception_handler(*args, **kwargs) else: return self._sync_exception_handler(*args, **kwargs) return wrapper async def _coroutine_exception_handler(self, *args, **kwargs): try: return await self.func(*args, **kwargs) except Exception as e: if self.custom_handlers and e.__class__ in self.custom_handlers: return self.custom_handlers[e.__class__]() if e.__class__ not in self.exclude: raise e def _sync_exception_handler(self, *args, **kwargs): try: return self.func(*args, **kwargs) except Exception as e: if self.custom_handlers and e.__class__ in self.custom_handlers: return self.custom_handlers[e.__class__]() if e.__class__ not in self.exclude: raise e
рд╣рдо рдХреНрд░рдо рдореЗрдВ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗред
__slots__ рдореИрдВ рдереЛрдбрд╝реА рдореЗрдореЛрд░реА рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ
рдХрд░рддрд╛ рд╣реВрдВред рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реИ рдЕрдЧрд░ рд╡рд╕реНрддреБ рдЕрдХреНрд╕рд░ рд╕реВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
__Init__ рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЪрд░рдг рдореЗрдВ, рд╣рдо рдХрд╕реНрдЯрдо_рд╣реИрдВрдбрд▓рд░реНрд╕ рдХреЛ рдмрдЪрд╛рддреЗ рд╣реИрдВ (рдпрджрд┐ рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ рддреЛ)ред рдмрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЙрдиреНрд╣реЛрдВрдиреЗ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдХрд┐ рд╣рдо рд╡рд╣рд╛рдВ рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рджреЗрдЦрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╢рд╛рдпрдж рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдпрд╣ рдореБрд╢реНрдХрд┐рд▓ рд╕реЗ рдХреБрдЫ рдЬреЛрдбрд╝реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред Self.exclude рдкреНрд░реЙрдкрд░реНрдЯреА рдореЗрдВ рдЕрдкрд╡рд╛рджреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ, рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдлрд╝рдВрдХреНрд╢рди рдХреЛрдИ рдирд╣реАрдВ рд▓реМрдЯреЗрдЧрд╛ред рдлрд┐рд▓рд╣рд╛рд▓, рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рд╕реВрдЪреА рдХреЛ рддреЗрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд╢рд╛рдпрдж рдпрд╣ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд __call__ рдореЗрдВ рд╣реЛрддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмрд┐рдирд╛ рднреА:
@ProcessException() def some_function(*args): return None
рдпрд╛рдиреА рдпрд╣ рдЧрд▓рдд рд╣реЛрдЧрд╛ рдФрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рдЙрдард╛рдИ рдЬрд╛рдПрдЧреА:
@ProcessException def some_function(*args): return None
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдлрд╝рдВрдХреНрд╢рди рдорд┐рд▓рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕рдХреА рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХрддрд╛ рдХреА рдбрд┐рдЧреНрд░реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо рдпрд╛ рддреЛ рдПрдХ рдирд┐рдпрдорд┐рдд рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╛ рдПрдХ рдХреЛрд░рдЯрд╛рдЗрди рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░реЗрдВрдЧреЗред
рдЖрдк рдпрд╣рд╛рдВ рдкрд░ рдХреНрдпрд╛ рдзреНрдпрд╛рди рджреЗ рд╕рдХрддреЗ рд╣реИрдВред рдкрд╣рд▓реА рд╕рдВрдкрддреНрддрд┐ рдкрд░ рдПрдХ рдЬрд╛рдВрдЪ рд╣реИ:
if self.custom_handlers: if isinstance(self.custom_handlers, property): self.custom_handlers = self.custom_handlers.__get__(self, self.__class__)
рдореИрдВ рдРрд╕рд╛ рдХреНрдпреЛрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ?
рдмреЗрд╢рдХ
рдЗрд╕рд▓рд┐рдП рдирд╣реАрдВ
рдореИрдВ рдЖрдИрдЯреА рдорд╛рдпрд╛рдХреЛрд╡рд╕реНрдХреА рд╣реВрдВ
рдФрд░ рд╡реЗ рдореБрдЭреЗ рд▓рд╛рдЗрди рд╕реЗ рд▓рд╛рдЗрди рдкреЗ рдХрд░рддреЗ рд╣реИрдВред
рджреЛ
рдЕрдЧрд░ рдкрдардиреАрдпрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ
рд╣реИрдВ (рд╣рд╛рдБ, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдб рдХреЛ рдПрдХ рд╡реНрдпрдХреНрддрд┐ рджреНрд╡рд╛рд░рд╛ рджреБрдЦрд╡рд╛рджреА рдкреНрд░рд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ), рдФрд░ рд╣рдо рд╕реНрд╡рдпрдВ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЬреЛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ, рдЙрд╕рдореЗрдВ рд╣рдо рд╕реНрд╡ред рд╣реИрдВрдбрд▓рд░ @property рд╡рд░реНрдЧ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрддред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:
class Math(object): @property def exception_handlers(self): return { ZeroDivisionError: lambda: ' , ' } @ProcessException(exception_handlers) def divide(self, a, b): return a // b
рдпрджрд┐ рд╣рдо self.custom_handlers .__ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ ред__ __ (...) рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ @property рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рдмрдЬрд╛рдп рд╣рдореЗрдВ 0x7f78d844f9b0 рдкрд░ <рд╕рдВрдкрддреНрддрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреИрд╕реА рдХреБрдЫ рдЪреАрдЬрд╝ рдорд┐рд▓реЗрдЧреАред
рджрд░рдЕрд╕рд▓, рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдХрд╕реНрдЯрдо рд╣реИрдВрдбрд▓рд░реНрд╕ рдХреЛ рдХреИрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
@ProcessException({ZeroDivisionError: lambda: ' , '}) def divide(a, b): return a // b
рдПрдХ рд╡рд░реНрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ (рдпрджрд┐ рд╣рдо рдЧреБрдгреЛрдВ / рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ), рддреЛ рд╣рдореЗрдВ рдЗрд╕ рдмрд╛рдд рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╡рд░реНрдЧ
рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдХреЛ рдЗрд╕ рддрд░рд╣
рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдЪрд░рдг рдореЗрдВ , рддрд░реАрдХреЗ рдФрд░ рдЧреБрдг рд╕рд░рд▓ рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдХреЗрд╡рд▓ рдпрд╣ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдКрдкрд░ рдХреНрдпрд╛ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, @property рд╡рд┐рдХрд▓реНрдк рдЙрди рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ рдЬреЛ рдХреЛрдб рдореЗрдВ рдХрдо рд╣реИрдВред рдареАрдХ рд╣реИ, рдпрд╛ рддреЛ рдЖрдк рд▓рдВрдмреЛрджрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рд╕реНрд╡рдпрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рдХреЗ рд▓рд┐рдП, рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдЙрджрд╛рд╣рд░рдг рд╕рддреНрдп рд╣реИрдВред
рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдЗрд╕ рддрдереНрдп рдкрд░ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрджрд┐ рдЗрд╕рдХреЗ рдорд╛рд░реНрдЧ рдореЗрдВ рдХреЛрдИ рдЕрдкрд╡рд╛рдж рдХрд╕реНрдЯрдо рд╣реИрдВрдбрд▓рд░реНрд╕ рдХреЛ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдмрд╕ рдЖрдЧреЗ рдмрдврд╝рддрд╛ рд╣реИред
рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рд╣реИред рдореЗрд░реЗ рд▓реЗрдЦ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред