Skip to content

Commit 92bcb74

Browse files
feat: improve JSON error logging for Durable (#298)
* Improve Durable JSON serialization error logging * Improve Durable JSON serialization error messages * Add tests * Remove unused test code --------- Co-authored-by: hallvictoria <[email protected]>
1 parent 025f801 commit 92bcb74

File tree

2 files changed

+28
-4
lines changed

2 files changed

+28
-4
lines changed

azure/functions/durable_functions.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,10 +99,10 @@ def decode(cls,
9999
except json.JSONDecodeError:
100100
# String failover if the content is not json serializable
101101
result = data.value
102-
except Exception:
102+
except Exception as e:
103103
raise ValueError(
104104
'activity trigger input must be a string or a '
105-
f'valid json serializable ({data.value})')
105+
f'valid json serializable ({data.value})') from e
106106
else:
107107
raise NotImplementedError(
108108
f'unsupported activity trigger payload type: {data_type}')
@@ -115,9 +115,9 @@ def encode(cls, obj: typing.Any, *,
115115
try:
116116
callback = _durable_functions._serialize_custom_object
117117
result = json.dumps(obj, default=callback)
118-
except TypeError:
118+
except TypeError as e:
119119
raise ValueError(
120-
f'activity trigger output must be json serializable ({obj})')
120+
f'activity trigger output must be json serializable ({obj})') from e
121121

122122
return meta.Datum(type='json', value=result)
123123

tests/test_durable_functions.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,19 @@ def test_activity_trigger_encode(self):
165165
expected_type=type(datum['output']))
166166
self.assertEqual(encoded, datum['expected_value'])
167167

168+
def test_activity_trigger_encode_failure_exception_has_cause(self):
169+
class NonEncodable:
170+
def __init__(self):
171+
self.value = 'foo'
172+
173+
data = NonEncodable()
174+
175+
try:
176+
ActivityTriggerConverter.encode(data, expected_type=None)
177+
except ValueError as e:
178+
self.assertIsNotNone(e.__cause__)
179+
self.assertIsInstance(e.__cause__, TypeError)
180+
168181
def test_activity_trigger_decode(self):
169182
# Activity Trigger allow inputs to be any JSON serializables
170183
# The input values to the trigger should be passed into arguments
@@ -209,6 +222,17 @@ def test_activity_trigger_decode(self):
209222
trigger_metadata=None)
210223
self.assertEqual(decoded, datum['expected_value'])
211224

225+
def test_activity_trigger_decode_failure_exception_has_cause(self):
226+
data = Datum('{"value": "bar"}', 'json')
227+
228+
try:
229+
ActivityTriggerConverter.decode(
230+
data=data,
231+
trigger_metadata=None)
232+
except ValueError as e:
233+
self.assertIsNotNone(e.__cause__)
234+
self.assertIsInstance(e.__cause__, TypeError)
235+
212236
def test_activity_trigger_has_implicit_return(self):
213237
self.assertTrue(
214238
ActivityTriggerConverter.has_implicit_output()

0 commit comments

Comments
 (0)