3.10 Error Payload
SData uses HTTP status codes to indicate errors. In many REST applications, a status code and a status message is sufficient. However, in business applications it is better to provide a detailed diagnoses when an error occurs. SData defines an XML format for error information.
Here is an example of an SData error entry:
<sdata:diagnosis> <sdata:severity>error</sdata:severity> <sdata:sdataCode>BadWhereSyntax</sdata:sdataCode> <sdata:applicationCode/> <sdata:message>Invalid query syntax: function 'foo' does not exist</sdata:message> <sdata:stackTrace/> <sdata:payloadPath/> </sdata:diagnosis>
The elements of the error payload are now described:
| Element | Description |
|---|---|
| severity | Severity of the diagnosis entry. Possible values are: * Info: Informational message - does not require any special attention. * Warning: Warning message - does not prevent operation from succeeding but may require attention. * Transient: Transient error - operation failed but may succeed later in the same condition (record locked for 'xxx'). * Error: Error: Operation failed - request should be modified before resubmitting. * Fatal: Severe error - operation should not be reattempted. Other operations are likely to fail too. |
| sdataCode | The SData diagnosis code (see table below) |
| applicationCode | The application specific diagnosis code. This should only be set when sdataCode is set to ApplicationDiagnosis. |
| message | A friendly message for the diagnosis. |
| stackTrace | The stack trace for the error. It should only be filled when the service is run in “development” mode. |
| payloadPath | XPath expression that refers to the payload element responsible for the error. This element is only used when the error is related to a specific piece of data being sent to the service provider. For example when updating a resource, or when submitting a service request. |
SData defines the following set of values for the code element:
| SData diagnosis code | Description |
|---|---|
| BadUrlSyntax | Invalid URL syntax. |
| BadQueryParameter | Invalid Query Parameter. |
| ApplicationNotFound | Application does not exist. |
| ApplicationUnavailable | Application exists but is not available. |
| DatasetNotFound | Dataset does not exist. |
| DatasetUnavailable | Dataset exists but is not available. |
| ContractNotFound | Contract does not exist. |
| ResourceKindNotFound | Resource kind does not exist. |
| BadWhereSyntax | Invalid syntax for a where condition. |
| ApplicationDiagnosis | Application specific diagnosis, detail is in the applicationCode element. |
This list may be extended in the future. Errors that do not match a specific code should be reported with the ApplicationDiagnosis code.
One or more <sdata:diagnosis> elements can be placed inside an Atom <feed> or <entry> element. This allows an SData service to return several diagnoses for an operation. This can be useful when processing create or update requests since several business rules could give a diagnosis for a given entry, and it is useful to be able to report them all to the consumer. Some may have different severity levels.
When the response does not contain a <feed> or <entry> (for example when a GET fails), the <sdata:diagnosis> element(s) should be inserted in the <sdata:diagnoses> element. The error payload would look like this:
<sdata:diagnoses xmlns="http://schemas.sage.com/sdata/2008/1"> <sdata:diagnosis> ... </sdata:diagnosis> <sdata:diagnosis> ... </sdata:diagnosis> </sdata:diagnoses>
SData providers MUST return errors as described above.


