Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion modern_di_taskiq/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,11 @@ async def build_di_container(
async with fetch_di_container(context.broker).build_child_container(
scope=match.scope, context=match.context
) as container:
yield container
try:
yield container
except Exception: # noqa: BLE001
# taskiq throws the task's own error in here and logs it again if it comes back out.
return


@dataclasses.dataclass(slots=True, frozen=True)
Expand Down
21 changes: 21 additions & 0 deletions tests/test_taskiq_di.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import logging
import re
import typing

import pytest
from modern_di import Container, Group, Scope, providers
from taskiq import InMemoryBroker

Expand Down Expand Up @@ -119,6 +121,25 @@ async def boom(_res: typing.Annotated[SimpleCreator, FromDI(Boom.resource)]) ->
assert teardowns == ["closed"] # per-task child was still closed (finalizer ran) on the error path


async def test_task_error_is_not_logged_again_as_a_teardown_error(
broker: InMemoryBroker, caplog: pytest.LogCaptureFixture
) -> None:
@broker.task(task_name="fails")
async def fails(_dep: typing.Annotated[SimpleCreator, FromDI(SimpleCreator)]) -> None:
msg = "kaboom"
raise ValueError(msg)

await broker.startup()
try:
with caplog.at_level(logging.WARNING):
result = await (await fails.kiq()).wait_result() # ty: ignore[no-matching-overload]
finally:
await broker.shutdown()

assert result.is_err is True
assert [r.getMessage() for r in caplog.records if r.name == "taskiq.dependencies.ctx"] == []


async def test_from_di_without_setup_di_raises_clear_runtime_error() -> None:
broker = InMemoryBroker()

Expand Down
Loading