|
8 | 8 | from ellar.core.context import ExecutionContext, IExecutionContext
|
9 | 9 | from ellar.core.datastructures import State, URLPath
|
10 | 10 | from ellar.core.events import EventHandler, RouterEventManager
|
| 11 | +from ellar.core.exceptions.interfaces import ( |
| 12 | + IExceptionHandler, |
| 13 | + IExceptionMiddlewareService, |
| 14 | +) |
11 | 15 | from ellar.core.guard import GuardCanActivate
|
12 | 16 | from ellar.core.middleware import (
|
13 | 17 | CORSMiddleware,
|
@@ -57,7 +61,6 @@ def __init__(
|
57 | 61 | self._injector: EllarInjector = injector
|
58 | 62 |
|
59 | 63 | self._global_guards = [] if global_guards is None else list(global_guards)
|
60 |
| - self._exception_handlers = dict(t.cast(dict, self.config.EXCEPTION_HANDLERS)) |
61 | 64 | self._user_middleware = list(t.cast(list, self.config.MIDDLEWARE))
|
62 | 65 |
|
63 | 66 | self.on_startup = RouterEventManager(
|
@@ -173,14 +176,11 @@ def config(self) -> Config: # type: ignore
|
173 | 176 | return self._config
|
174 | 177 |
|
175 | 178 | def build_middleware_stack(self) -> ASGIApp:
|
176 |
| - error_handler = None |
177 |
| - exception_handlers = {} |
178 |
| - |
179 |
| - for key, value in self._exception_handlers.items(): |
180 |
| - if key in (500, Exception): |
181 |
| - error_handler = value |
182 |
| - else: |
183 |
| - exception_handlers[key] = value |
| 179 | + service_middleware = self.injector.get( |
| 180 | + IExceptionMiddlewareService # type:ignore |
| 181 | + ) |
| 182 | + service_middleware.build_exception_handlers() |
| 183 | + error_handler = service_middleware.get_500_error_handler() |
184 | 184 |
|
185 | 185 | middleware = (
|
186 | 186 | [
|
@@ -212,7 +212,9 @@ def build_middleware_stack(self) -> ASGIApp:
|
212 | 212 | + self._user_middleware
|
213 | 213 | + [
|
214 | 214 | Middleware(
|
215 |
| - ExceptionMiddleware, handlers=exception_handlers, debug=self.debug |
| 215 | + ExceptionMiddleware, |
| 216 | + exception_middleware_service=service_middleware, |
| 217 | + debug=self.debug, |
216 | 218 | ),
|
217 | 219 | ]
|
218 | 220 | )
|
@@ -265,20 +267,11 @@ def _finalize_app_initialization(self) -> None:
|
265 | 267 |
|
266 | 268 | def add_exception_handler(
|
267 | 269 | self,
|
268 |
| - exc_class_or_status_code: t.Union[int, t.Type[Exception]], |
269 |
| - handler: t.Callable, |
270 |
| - ) -> None: # pragma: no cover |
271 |
| - self._exception_handlers[exc_class_or_status_code] = handler |
272 |
| - self.middleware_stack = self.build_middleware_stack() |
273 |
| - |
274 |
| - def exception_handler( |
275 |
| - self, exc_class_or_status_code: t.Union[int, t.Type[Exception]] |
276 |
| - ) -> t.Callable: # pragma: nocover |
277 |
| - def decorator(func: t.Callable) -> t.Callable: |
278 |
| - self.add_exception_handler(exc_class_or_status_code, func) |
279 |
| - return func |
280 |
| - |
281 |
| - return decorator |
| 270 | + exception_handler: IExceptionHandler, |
| 271 | + ) -> None: |
| 272 | + if exception_handler not in self.config.EXCEPTION_HANDLERS: |
| 273 | + self.config.EXCEPTION_HANDLERS.append(exception_handler) |
| 274 | + self.rebuild_middleware_stack() |
282 | 275 |
|
283 | 276 | def rebuild_middleware_stack(self) -> None:
|
284 | 277 | self.middleware_stack = self.build_middleware_stack()
|
0 commit comments