11# Copyright (c) Microsoft Corporation.
22# Licensed under the MIT license.
33
4+ """
5+ Structured Dataverse exception hierarchy.
6+
7+ This module provides :class:`~PowerPlatform.Dataverse.core.errors.DataverseError` and
8+ specialized :class:`~PowerPlatform.Dataverse.core.errors.ValidationError`,
9+ :class:`~PowerPlatform.Dataverse.core.errors.MetadataError`,
10+ :class:`~PowerPlatform.Dataverse.core.errors.SQLParseError`, and
11+ :class:`~PowerPlatform.Dataverse.core.errors.HttpError` for validation, metadata,
12+ SQL parsing, and Web API HTTP failures.
13+ """
14+
415from __future__ import annotations
516from typing import Any , Dict , Optional
617import datetime as _dt
@@ -10,24 +21,23 @@ class DataverseError(Exception):
1021 Base structured exception for the Dataverse SDK.
1122
1223 :param message: Human-readable error message.
13- :type message: str
24+ :type message: `` str``
1425 :param code: Error category code (e.g. ``"validation_error"``, ``"http_error"``).
15- :type code: str
26+ :type code: `` str``
1627 :param subcode: Optional subcategory or specific error identifier.
17- :type subcode: str or None
28+ :type subcode: `` str`` | `` None``
1829 :param status_code: Optional HTTP status code if the error originated from an HTTP response.
19- :type status_code: int or None
30+ :type status_code: `` int`` | `` None``
2031 :param details: Optional dictionary containing additional diagnostic information.
21- :type details: dict or None
32+ :type details: `` dict`` | `` None``
2233 :param source: Error source, either ``"client"`` or ``"server"``.
23- :type source: str
34+ :type source: `` str``
2435 :param is_transient: Whether the error is potentially transient and may succeed on retry.
25- :type is_transient: bool
36+ :type is_transient: `` bool``
2637 """
2738 def __init__ (
2839 self ,
2940 message : str ,
30- * ,
3141 code : str ,
3242 subcode : Optional [str ] = None ,
3343 status_code : Optional [int ] = None ,
@@ -50,7 +60,7 @@ def to_dict(self) -> Dict[str, Any]:
5060 Convert the error to a dictionary representation.
5161
5262 :return: Dictionary containing all error properties.
53- :rtype: dict
63+ :rtype: `` dict``
5464 """
5565 return {
5666 "message" : self .message ,
@@ -71,11 +81,11 @@ class ValidationError(DataverseError):
7181 Exception raised for client-side validation failures.
7282
7383 :param message: Human-readable validation error message.
74- :type message: str
84+ :type message: `` str``
7585 :param subcode: Optional specific validation error identifier.
76- :type subcode: str or None
86+ :type subcode: `` str`` | `` None``
7787 :param details: Optional dictionary with additional validation context.
78- :type details: dict or None
88+ :type details: `` dict`` | `` None``
7989 """
8090 def __init__ (self , message : str , * , subcode : Optional [str ] = None , details : Optional [Dict [str , Any ]] = None ):
8191 super ().__init__ (message , code = "validation_error" , subcode = subcode , details = details , source = "client" )
@@ -85,11 +95,11 @@ class MetadataError(DataverseError):
8595 Exception raised for metadata operation failures.
8696
8797 :param message: Human-readable metadata error message.
88- :type message: str
98+ :type message: `` str``
8999 :param subcode: Optional specific metadata error identifier.
90- :type subcode: str or None
100+ :type subcode: `` str`` | `` None``
91101 :param details: Optional dictionary with additional metadata context.
92- :type details: dict or None
102+ :type details: `` dict`` | `` None``
93103 """
94104 def __init__ (self , message : str , * , subcode : Optional [str ] = None , details : Optional [Dict [str , Any ]] = None ):
95105 super ().__init__ (message , code = "metadata_error" , subcode = subcode , details = details , source = "client" )
@@ -99,11 +109,11 @@ class SQLParseError(DataverseError):
99109 Exception raised for SQL query parsing failures.
100110
101111 :param message: Human-readable SQL parsing error message.
102- :type message: str
112+ :type message: `` str``
103113 :param subcode: Optional specific SQL parsing error identifier.
104- :type subcode: str or None
114+ :type subcode: `` str`` | `` None``
105115 :param details: Optional dictionary with SQL query context and parse information.
106- :type details: dict or None
116+ :type details: `` dict`` | `` None``
107117 """
108118 def __init__ (self , message : str , * , subcode : Optional [str ] = None , details : Optional [Dict [str , Any ]] = None ):
109119 super ().__init__ (message , code = "sql_parse_error" , subcode = subcode , details = details , source = "client" )
@@ -113,27 +123,27 @@ class HttpError(DataverseError):
113123 Exception raised for HTTP request failures from the Dataverse Web API.
114124
115125 :param message: Human-readable HTTP error message, typically from the API error response.
116- :type message: str
126+ :type message: `` str``
117127 :param status_code: HTTP status code (e.g. 400, 404, 500).
118- :type status_code: int
128+ :type status_code: `` int``
119129 :param is_transient: Whether the error is transient (429, 503, 504) and may succeed on retry.
120- :type is_transient: bool
130+ :type is_transient: `` bool``
121131 :param subcode: Optional HTTP status category (e.g. ``"4xx"``, ``"5xx"``).
122- :type subcode: str or None
132+ :type subcode: `` str`` | `` None``
123133 :param service_error_code: Optional Dataverse-specific error code from the API response.
124- :type service_error_code: str or None
134+ :type service_error_code: `` str`` | `` None``
125135 :param correlation_id: Optional correlation ID for tracking requests across services.
126- :type correlation_id: str or None
136+ :type correlation_id: `` str`` | `` None``
127137 :param request_id: Optional request ID from the API response headers.
128- :type request_id: str or None
138+ :type request_id: `` str`` | `` None``
129139 :param traceparent: Optional W3C trace context for distributed tracing.
130- :type traceparent: str or None
140+ :type traceparent: `` str`` | `` None``
131141 :param body_excerpt: Optional excerpt of the response body for diagnostics.
132- :type body_excerpt: str or None
142+ :type body_excerpt: `` str`` | `` None``
133143 :param retry_after: Optional number of seconds to wait before retrying (from Retry-After header).
134- :type retry_after: int or None
144+ :type retry_after: `` int`` | `` None``
135145 :param details: Optional additional diagnostic details.
136- :type details: dict or None
146+ :type details: `` dict`` | `` None``
137147 """
138148 def __init__ (
139149 self ,
0 commit comments