Fehler und Wiederholungen Diese Seite ist aus dem Englischen übersetzt. Wenn die beiden voneinander abweichen, ist die englische Seite maßgeblich. Englische Seite lesen
Jeder Fehlschlag, den eine Bibliothek auslöst, ist einer von vier Fehlern, und alle vier teilen sich einen Basistyp, sodass ein einziger Handler alle abfangen kann.
API-Fehler. Die API hat die Anfrage abgelehnt. Er enthält den HTTP-Status, einen stabilen code, nach dem Sie verzweigen können, und eine Meldung in der Sprache, die Sie angefordert haben.
OAuth-Fehler. Der Token-Endpunkt hat Ihre Zugangsdaten oder die angeforderten Scopes abgelehnt.
Wartungsfehler. Die API ist wegen Wartungsarbeiten kurzzeitig nicht verfügbar.
Transportfehler. Es kam keine verwertbare Antwort an: Die Verbindung ist fehlgeschlagen oder hat das Zeitlimit überschritten, oder die Antwort konnte nicht gelesen werden.
Einen Aufruf abzubrechen ist kein Fehler. Das zeigt sich als der sprachtypische Abbruchmechanismus.
Was wiederholt wird
Ein 429 oder 503, der in einem Retry-After-Header von höchstens 60 Sekunden angibt, wie lange zu warten ist, wird nach genau dieser Wartezeit wiederholt. Ein Aufruf unternimmt höchstens 3 Versuche. Sie können Wiederholungen abschalten, indem Sie das Maximum auf 1 setzen.
Alles andere wird sofort ausgelöst:
ein 429 oder 503 ohne Retry-After;
eine Wartezeit von mehr als 60 Sekunden, die die Bibliothek nicht innerhalb Ihres Aufrufs verbringt. Der Fehler enthält retry_after, sodass Sie die Wiederholung selbst einplanen können;
ein Transportfehler, weil die Anfrage die API möglicherweise bereits erreicht hat;
jeder Stream, der bereits ein Event geliefert hat.
Sprache des Codebeispiels TypeScript Rust Go Java Kotlin Ruby PHP TypeScript
import { ApiError, MaintenanceError, OAuthError, TransportError } from "@lingara/api" ;
try {
await client. getUsage ();
} catch (e) {
if (e instanceof ApiError ) {
// A refusal from the API: e.status, e.code (stable) and e.message (localised).
console. error (e.status, e.code, e.message, e.retryAfter ?? "" );
} else if (e instanceof OAuthError ) {
// The token endpoint refused the credentials or the scopes.
console. error (e.status, e.error, e.description ?? "" );
} else if (e instanceof MaintenanceError ) {
console. error ( "under maintenance; retry after" , e.retryAfter ?? "a while" );
} else if (e instanceof TransportError ) {
// No usable answer: connect, tls, reset, timeout, and so on.
console. error ( "transport:" , e.kind);
} else {
throw e;
}
} Rust
use lingara :: Error ;
let result = client . get_usage () .await ;
if let Some (wait) = result . as_ref () . err () . and_then ( Error :: retry_after) {
eprintln! ( "the API asks you to retry after {wait:?}" );
}
match result {
Ok (usage) => println! ( "{} allowance rows" , usage . allowance . len ()),
// A refusal from the API: status, code (stable) and message (localised).
Err ( Error :: Api (e)) => eprintln! ( "{} {} {}" , e . status, e . code, e . message),
// The token endpoint refused the credentials or the scopes.
Err ( Error :: OAuth (e)) => eprintln! ( "{} {} {}" , e . status, e . error, e . description . unwrap_or_default ()),
Err ( Error :: Maintenance (_)) => eprintln! ( "the API is under maintenance" ),
// No usable answer: connect, tls, reset, timeout, and so on.
Err ( Error :: Transport (e)) => eprintln! ( "transport: {}" , e . kind),
Err (other) => return Err (other . into ()),
} Go
_, err := client. GetUsage (ctx)
var apiErr * lingara . APIError
var oauthErr * lingara . OAuthError
var maintenance * lingara . MaintenanceError
var transport * lingara . TransportError
switch {
case err == nil :
case errors. As (err, & apiErr):
// A refusal from the API: Status, Code (stable) and Message (localised).
fmt. Println (apiErr.Status, apiErr.Code, apiErr.Message)
if apiErr.RetryAfter != nil {
fmt. Println ( "retry after" , * apiErr.RetryAfter)
}
case errors. As (err, & oauthErr):
// The token endpoint refused the credentials or the scopes.
fmt. Println (oauthErr.Status, oauthErr.ErrorCode, oauthErr.Description)
case errors. As (err, & maintenance):
fmt. Println ( "under maintenance" )
if maintenance.RetryAfter != nil {
fmt. Println ( "retry after" , * maintenance.RetryAfter)
}
case errors. As (err, & transport):
// No usable answer: connect, tls, reset, timeout, and so on.
fmt. Println ( "transport:" , transport.Kind)
default :
// ctx was cancelled or timed out: errors.Is(err, context.Canceled).
fmt. Println (err)
} Java
try {
client. getUsage ();
} catch (LingaraException e ) {
if (e instanceof ApiException api) {
// A refusal from the API: status(), code() (stable) and getMessage() (localised).
System.out. println (api. status () + " " + api. code () + " " + api. getMessage ());
api. retryAfter (). ifPresent (wait -> System.out. println ( "retry after " + wait));
} else if (e instanceof OAuthException oauth) {
// The token endpoint refused the credentials or the scopes.
System.out. println (oauth. status () + " " + oauth. error () + " " + oauth. description ());
} else if (e instanceof MaintenanceException maintenance) {
System.out. println ( "under maintenance" );
maintenance. retryAfter (). ifPresent (wait -> System.out. println ( "retry after " + wait));
} else if (e instanceof TransportException transport) {
// No usable answer: CONNECT, TLS, RESET, TIMEOUT, and so on.
System.out. println ( "transport: " + transport. kind ());
}
}
// An interrupted call throws java.util.concurrent.CancellationException instead. Kotlin
try {
client. getUsage ()
} catch (e: LingaraException ) {
when (e) {
// A refusal from the API: status, code (stable) and message (localised).
is ApiException -> println ( "${e.status} ${e.code} ${e.message}; retry after ${e.retryAfter}" )
// The token endpoint refused the credentials or the scopes.
is OAuthException -> println ( "${e.status} ${e.error} ${e.description}" )
is MaintenanceException -> println ( "under maintenance; retry after ${e.retryAfter}" )
// No usable answer: CONNECT, TLS, RESET, TIMEOUT, and so on.
is TransportException -> println ( "transport: ${e.kind}" )
}
}
// A cancelled call throws the caller's own CancellationException instead. Ruby
begin
client. get_usage
rescue Lingara :: ApiError => e
# A refusal from the API: status, code (stable) and message (localised).
puts " #{e. status } #{e. code } : #{e. message } "
puts "retry after #{e. retry_after } s" if e. retry_after
rescue Lingara :: OAuthError => e
# The token endpoint refused the credentials or the scopes.
puts " #{e. status } #{e. error } : #{e. description } "
rescue Lingara :: MaintenanceError => e
puts "under maintenance"
puts "retry after #{e. retry_after } s" if e. retry_after
rescue Lingara :: TransportError => e
# No usable answer: :connect, :tls, :reset, :timeout, and so on.
puts "transport: #{e. kind } "
end PHP
use Lingara\Exception\ApiException ;
use Lingara\Exception\LingaraException ;
use Lingara\Exception\MaintenanceException ;
use Lingara\Exception\OAuthException ;
use Lingara\Exception\TransportException ;
try {
$client -> getUsage ();
} catch ( LingaraException $e) {
if ($e instanceof ApiException ) {
// A refusal from the API: status, errorCode (stable) and message (localised).
echo $e -> status (), ' ' , $e -> errorCode (), ': ' , $e -> getMessage (), " \n " ;
echo 'retry after: ' , $e -> retryAfter () ?? 'not given' , " \n " ;
} elseif ($e instanceof OAuthException ) {
// The token endpoint refused the credentials or the scopes.
echo $e -> status (), ' ' , $e -> error (), ': ' , $e -> description (), " \n " ;
} elseif ($e instanceof MaintenanceException ) {
echo 'under maintenance; retry after: ' , $e -> retryAfter () ?? 'not given' , " \n " ;
} elseif ($e instanceof TransportException ) {
// No usable answer: connect, tls, reset, timeout, and so on.
echo 'transport: ' , $e -> kind () -> value, " \n " ;
}
}