Skip to content

Commit 8b3af4d

Browse files
committed
Convert nexus_handler_failure_info as nexusrpc.HandlerError
1 parent 993bfd3 commit 8b3af4d

File tree

3 files changed

+18
-23
lines changed

3 files changed

+18
-23
lines changed

temporalio/converter.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
from datetime import datetime
1717
from enum import IntEnum
1818
from itertools import zip_longest
19+
from logging import getLogger
1920
from typing import (
2021
Any,
2122
Awaitable,
@@ -40,6 +41,7 @@
4041
import google.protobuf.json_format
4142
import google.protobuf.message
4243
import google.protobuf.symbol_database
44+
import nexusrpc
4345
import typing_extensions
4446

4547
import temporalio.api.common.v1
@@ -60,6 +62,8 @@
6062
if sys.version_info >= (3, 10):
6163
from types import UnionType
6264

65+
logger = getLogger(__name__)
66+
6367

6468
class PayloadConverter(ABC):
6569
"""Base payload converter to/from multiple payloads/values."""
@@ -1014,9 +1018,16 @@ def from_failure(
10141018
)
10151019
elif failure.HasField("nexus_handler_failure_info"):
10161020
nexus_handler_failure_info = failure.nexus_handler_failure_info
1017-
err = temporalio.exceptions.NexusHandlerError(
1021+
try:
1022+
_type = nexusrpc.HandlerErrorType[nexus_handler_failure_info.type]
1023+
except KeyError:
1024+
logger.warning(
1025+
f"Unknown Nexus HandlerErrorType: {nexus_handler_failure_info.type}"
1026+
)
1027+
_type = nexusrpc.HandlerErrorType.INTERNAL
1028+
return nexusrpc.HandlerError(
10181029
failure.message or "Nexus handler error",
1019-
type=nexus_handler_failure_info.type,
1030+
type=_type,
10201031
retryable={
10211032
temporalio.api.enums.v1.NexusHandlerErrorRetryBehavior.NEXUS_HANDLER_ERROR_RETRY_BEHAVIOR_RETRYABLE: True,
10221033
temporalio.api.enums.v1.NexusHandlerErrorRetryBehavior.NEXUS_HANDLER_ERROR_RETRY_BEHAVIOR_NON_RETRYABLE: False,

temporalio/exceptions.py

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -362,22 +362,6 @@ def retry_state(self) -> Optional[RetryState]:
362362
return self._retry_state
363363

364364

365-
class NexusHandlerError(FailureError):
366-
"""Error raised on Nexus handler failure."""
367-
368-
def __init__(
369-
self,
370-
message: str,
371-
*,
372-
type: str,
373-
retryable: Optional[bool] = None,
374-
):
375-
"""Initialize a Nexus handler error."""
376-
super().__init__(message)
377-
self._type = type
378-
self._retryable = retryable
379-
380-
381365
class NexusOperationError(FailureError):
382366
"""Error raised on Nexus operation failure."""
383367

tests/nexus/test_workflow_caller.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
WorkflowHandle,
3939
)
4040
from temporalio.common import WorkflowIDConflictPolicy
41-
from temporalio.exceptions import CancelledError, NexusHandlerError, NexusOperationError
41+
from temporalio.exceptions import CancelledError, NexusOperationError
4242
from temporalio.nexus import WorkflowRunOperationContext, workflow_run_operation
4343
from temporalio.service import RPCError, RPCStatusCode
4444
from temporalio.worker import Worker
@@ -479,7 +479,7 @@ async def test_sync_response(
479479
e = ei.value
480480
assert isinstance(e, WorkflowFailureError)
481481
assert isinstance(e.__cause__, NexusOperationError)
482-
assert isinstance(e.__cause__.__cause__, NexusHandlerError)
482+
assert isinstance(e.__cause__.__cause__, nexusrpc.HandlerError)
483483
# ID of first command
484484
assert e.__cause__.scheduled_event_id == 5
485485
assert e.__cause__.endpoint == make_nexus_endpoint_name(task_queue)
@@ -532,7 +532,7 @@ async def test_async_response(
532532
e = ei.value
533533
assert isinstance(e, WorkflowFailureError)
534534
assert isinstance(e.__cause__, NexusOperationError)
535-
assert isinstance(e.__cause__.__cause__, NexusHandlerError)
535+
assert isinstance(e.__cause__.__cause__, nexusrpc.HandlerError)
536536
# ID of first command after update accepted
537537
assert e.__cause__.scheduled_event_id == 6
538538
assert e.__cause__.endpoint == make_nexus_endpoint_name(task_queue)
@@ -709,7 +709,7 @@ async def test_untyped_caller(
709709
e = ei.value
710710
assert isinstance(e, WorkflowFailureError)
711711
assert isinstance(e.__cause__, NexusOperationError)
712-
assert isinstance(e.__cause__.__cause__, NexusHandlerError)
712+
assert isinstance(e.__cause__.__cause__, nexusrpc.HandlerError)
713713
else:
714714
result = await caller_wf_handle.result()
715715
assert result.op_output.value == (
@@ -1167,7 +1167,7 @@ async def test_errors_raised_by_nexus_operation(
11671167
task_queue=task_queue,
11681168
)
11691169
if action_in_sync_op == "raise_handler_error":
1170-
assert result == ["NexusOperationError", "NexusHandlerError"]
1170+
assert result == ["NexusOperationError", "HandlerError"]
11711171
elif action_in_sync_op == "raise_operation_error":
11721172
assert result == ["NexusOperationError", "ApplicationError"]
11731173
else:

0 commit comments

Comments
 (0)