Errors¶
Every tool returns the same error shape on failure. There is no isError
flag; the presence of error_class is what a client branches on.
{
"error_class": "tap_query_error",
"message": "ERROR: function q3c_radial_query(...) does not exist",
"retry_strategy": "fix_and_retry",
"request_id": "a1b2c3d4e5f6",
"hint": "..."
}
hint is present only when there is something to say. retry_after_seconds
is defined on the payload but no error currently sets it. request_id is a
12-character hex string (uuid4().hex[:12]) matching the server log line for
the failure; it is present in HTTP mode only — under --stdio there is no
request-id middleware, so the field is absent.
Error classes¶
The table below is each class’s default retry_strategy. A few call sites
override it for a specific failure — see “Overrides” below — so always read
retry_strategy off the payload rather than assuming it from error_class.
|
|
Raised when |
|---|---|---|
|
|
An argument is invalid before any request is made: a malformed URL scheme, a missing host, a bad parameter, or |
|
|
The archive failed or timed out (HTTP 5xx, connection error, sync timeout) |
|
|
The archive understood the query and rejected it (bad ADQL, unknown column, unsupported geometry). May carry an error hint from the archive notes |
|
|
|
|
|
The archive no longer has the job (UWS 404/410). It will not come back; re-submit the query |
|
|
Anything unexpected inside the server. The message is generic; the cause is in the server log under |
Overrides:
_url_guard.ensure_safe_urlraisesvalidation_errorwithretry_strategy="abandon", notfix_and_retry, for a host outsideMANNA_ALLOWED_HOSTS, a host that cannot be resolved, or a host that resolves to a non-public address — none of those can be fixed by changing the call. Only a bad scheme or an empty host stayfix_and_retry.backends/registry.pyraisesarchive_errorwithretry_strategy="abandon"for an IVOID the registry has never heard of.tools/tap.py’sget_async_job_resultsandworkflows/count.py’s async count polling both raisevalidation_errorwithretry_strategy="abandon"when the job phase isABORTED— there is nothing to retry, the job is dead.
Retry strategies¶
|
What the model should do |
|---|---|
|
Change the arguments and call again |
|
Wait ( |
|
Call |
|
Stop; the call cannot succeed as made |
Error hints¶
When a tap_query_error matches a pitfall in the archive notes, the fix rides
back in hint. This is the error hint channel: it exists because a model
that had already read the same advice in list_archives still wrote the wrong
idiom, and the error payload is the one thing it reliably reads at failure
time (Concepts).
Python¶
The classes behind these payloads are in manna.errors
(Python API).