Skip to content

Commit c7906e3

Browse files
committed
feat: server error handling more robust
1 parent 096fe63 commit c7906e3

File tree

2 files changed

+58
-4
lines changed

2 files changed

+58
-4
lines changed

src/ansys/dpf/gate/errors.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,25 @@
11
import types
2+
import sys
23
from functools import wraps
34

45
class DPFServerException(Exception):
56
"""Error raised when the DPF server has encountered an error."""
67

78
def __init__(self, msg=""):
8-
parts = msg.rsplit('<-', maxsplit=1)
9-
error_message = parts[1]
10-
error_note = parts[0]
9+
message_parts = msg.rsplit('<-', maxsplit=1)
10+
error_note = ""
11+
if len(message_parts) == 1:
12+
error_message = message_parts[0]
13+
else:
14+
error_note, error_message = message_parts
1115

1216
Exception.__init__(self, error_message)
13-
self.add_note(error_note)
17+
if sys.version_info >= (3, 11): #add_note method is supported only in python >= 3.11
18+
self.add_note(error_note)
19+
else:
20+
if not hasattr(self, "__notes__"): #if the system is python < 3.11 we custom our own notes property
21+
self.__notes__ = []
22+
self.__notes__.append(error_note)
1423

1524

1625
class DPFServerNullObject(Exception):

tests/test_server_errors.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# Copyright (C) 2020 - 2025 ANSYS, Inc. and/or its affiliates.
2+
# SPDX-License-Identifier: MIT
3+
#
4+
#
5+
# Permission is hereby granted, free of charge, to any person obtaining a copy
6+
# of this software and associated documentation files (the "Software"), to deal
7+
# in the Software without restriction, including without limitation the rights
8+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
# copies of the Software, and to permit persons to whom the Software is
10+
# furnished to do so, subject to the following conditions:
11+
#
12+
# The above copyright notice and this permission notice shall be included in all
13+
# copies or substantial portions of the Software.
14+
#
15+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+
# SOFTWARE.
22+
23+
import pytest
24+
import sys
25+
26+
from ansys import dpf
27+
from ansys.dpf.core import errors, operators as ops
28+
29+
def test_server_exception_from_operator():
30+
ds = dpf.core.DataSources(r"dummy/file.rst")
31+
op = ops.result.displacement(data_sources=ds)
32+
with pytest.raises(errors.DPFServerException) as exception_note:
33+
op.eval()
34+
35+
assert hasattr(exception_note, '__notes__'), "The exception does not contain any note"
36+
assert exception_note.__notes__
37+
38+
def test_server_exception_from_workflow():
39+
disp = ops.result.displacement()
40+
workflow = dpf.Workflow()
41+
42+
workflow.add_operator(disp)
43+
workflow.set_output_name("displacement", disp.outputs.fields_container)
44+
workflow.eval()
45+

0 commit comments

Comments
 (0)