Skip to content

exceptions

exceptions

Modern Domo Exception classes with improved structure and usability

AuthError

AuthError(res: Any | None = None, **kwargs)

Bases: DomoError

Exception for authentication-related errors.

Source code in src/crew_dcs/base/exceptions.py
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
def __init__(self, res: Any | None = None, **kwargs):
    self.res = res

    if self.res:
        if not kwargs.get("message"):
            response = getattr(self.res, "response", None)
            if isinstance(response, dict):
                error_msg = (
                    response.get("message")
                    or response.get("error")
                    or response.get("reason")
                )
                if error_msg:
                    kwargs["message"] = str(error_msg)
            elif isinstance(response, str):
                kwargs["message"] = response

        if not kwargs.get("parent_class"):
            kwargs["parent_class"] = getattr(self.res, "parent_class", None)
        if not kwargs.get("status"):
            kwargs["status"] = getattr(self.res, "status", None)
        if not kwargs.get("domo_instance"):
            auth = getattr(self.res, "auth", None)
            if auth:
                kwargs["domo_instance"] = getattr(auth, "domo_instance", None)

    super().__init__(**kwargs)

ClassError

ClassError(
    cls: Any = None,
    cls_instance: Any = None,
    entity_id_col: str | None = "id",
    **kwargs
)

Bases: DomoError

Exception for class-specific errors.

Source code in src/crew_dcs/base/exceptions.py
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
def __init__(
    self,
    cls: Any = None,
    cls_instance: Any = None,
    entity_id_col: str | None = "id",
    **kwargs,
):
    self.cls = cls
    self.cls_instance = cls_instance
    self.entity_id_col = entity_id_col

    # Extract class-specific information
    if not kwargs.get("entity_id"):
        kwargs["entity_id"] = self._get_entity_id_str()
    if not kwargs.get("parent_class"):
        kwargs["parent_class"] = self._get_parent_class_str()

    super().__init__(**kwargs)

DomoError

DomoError(
    message: str | None = None,
    exception: Exception | None = None,
    entity_id: str | None = None,
    entity_name: str | None = None,
    function_name: str | None = None,
    parent_class: str | None = None,
    status: int | None = None,
    domo_instance: str | None = None,
    is_warning: bool = False,
    additional_context: dict[str, Any] | None = None,
)

Bases: Exception

Base exception for all Domo-related errors.

This exception stores all relevant context as attributes and provides a clean string representation for logging and debugging.

Source code in src/crew_dcs/base/exceptions.py
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
def __init__(
    self,
    message: str | None = None,
    exception: Exception | None = None,
    entity_id: str | None = None,
    entity_name: str | None = None,
    function_name: str | None = None,
    parent_class: str | None = None,
    status: int | None = None,
    domo_instance: str | None = None,
    is_warning: bool = False,
    additional_context: dict[str, Any] | None = None,
):
    self.message = message
    self.exception = exception
    self.entity_id = entity_id
    self.entity_name = entity_name
    self.function_name = function_name
    self.parent_class = parent_class
    self.status = status
    self.domo_instance = domo_instance
    self.is_warning = is_warning
    self.additional_context = additional_context or {}

    if not self.message and not self.exception:
        raise ValueError("Either 'message' or 'exception' must be provided.")

    # Use exception chaining if we have an original exception
    if self.exception:
        # This preserves the full traceback chain
        default_msg = self._generate_default_message
        super().__init__(
            f"{default_msg} (caused by: {type(self.exception).__name__}: {self.exception})"
        )
        # Explicitly set the cause for proper exception chaining
        self.__cause__ = self.exception
    else:
        super().__init__(self._generate_default_message)

RouteError

RouteError(res: Any | None = None, **kwargs)

Bases: DomoError

Exception for API route/endpoint errors.

Source code in src/crew_dcs/base/exceptions.py
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
def __init__(
    self,
    res: (
        Any | None
    ) = None,  # Should be ResponseGetData but avoiding circular import
    **kwargs,
):
    self.res = res

    # Extract information from response if available
    if self.res:
        if not kwargs.get("message"):
            # Try to extract meaningful error message from response
            response = getattr(self.res, "response", None)
            if isinstance(response, dict):
                error_msg = (
                    response.get("message")
                    or response.get("error")
                    or response.get("reason")
                )
                if error_msg:
                    kwargs["message"] = str(error_msg)
            elif isinstance(response, str):
                kwargs["message"] = response
            else:
                kwargs["message"] = None

        if not kwargs.get("parent_class"):
            kwargs["parent_class"] = getattr(self.res, "parent_class", None)
        if not kwargs.get("status"):
            kwargs["status"] = getattr(self.res, "status", None)
        if not kwargs.get("domo_instance"):
            auth = getattr(self.res, "auth", None)
            if auth:
                kwargs["domo_instance"] = getattr(auth, "domo_instance", None)

    # Call parent's __init__
    super().__init__(**kwargs)

TransportError

TransportError(**kwargs)

Bases: DomoError

Exception for client transport failures before an API response exists.

Source code in src/crew_dcs/base/exceptions.py
207
208
def __init__(self, **kwargs):
    super().__init__(**kwargs)